Файл – це набір даних, який зберігається на зовнішньому запам'ятовуючому пристрої (наприклад, на жорсткому диску). Файл має ім'я і розширення. Розширення дозволяє визначити, які дані і в якому форматі зберігаються у файлі.
Під роботою з файлами мається на увазі:
- створення файлів;
- видалення файлів;
- читання даних;
- запис даних;
- зміна параметрів файлу (ім'я, розширення...);
- інше.
В Сі-шарп є простір імен System.IO, в якому реалізовані всі необхідні нам класи для роботи з файлами. Щоб підключити цей простір імен, необхідно на самому початку програми додати рядок using System.IO. Для використання кодувань ще додамо простір using System.Text;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
Як створити файл?
Для створення пустого файлу, в класі File є метод Create(). Він приймає один аргумент – шлях. Нижче наведено приклад створення порожнього текстового файлу new_file.txt на диску D:
static void Main(string[] args)
{
File.Create("D:\\new_file.txt");
}
Якщо файл з таким ім'ям вже існує, він буде переписаний на новий порожній файл.
Метод WriteAllText() створює новий файл (якщо такого немає), або відкриває існуючий і записує текст, замінюючи все, що було в файлі:
static void Main(string[] args)
{
File. WriteAllText("D:\\new_file.txt", "текст");
}
Метод AppendAllText() працює, як і метод WriteAllText() за винятком того, що новий текст дописується в кінець файлу, а не переписує все що було в файлі:
static void Main(string[] args)
{
File.AppendAllText("D:\\new_file.txt", "текст методу AppendAllText ()"); //допише текст в кінець файлу
}
Як видалити файл?
Метод Delete() видаляє файл за вказаним шляхом:
static void Main(string[] args)
{
File.Delete("d:\\test.txt"); //видалення файлу
}
Крім того, щоб читати/записувати дані в файл з Сі-шарп можна використовувати потоки.
Потік – це абстрактне представлення даних (у байтах), що полегшує роботу з ними. В якості джерела даних може бути файл, пристрій вводу-виводу, принтер.
Клас Stream є абстрактним базовим класом для всіх потокових класів в Сі-шарп. Для роботи з файлами нам знадобиться клас FileStream (файловий потік).
FileStream - представляє потік, який дозволяє виконувати операції читання/запису в файл.
static void Main(string[] args)
{
FileStream file = new FileStream("d:\\test.txt", FileMode.Open
, FileAccess.Read); //відкриває файл тільки для читання
}
Режими відкриття FileMode:
- Append – відкриває файл (якщо існує) і переводить курсор у кінець файлу (дані будуть дописуватися в кінець), або створює новий файл. Цей режим можливий тільки при режимі доступу FileAccess.Write.
- Create - створює новий файл(якщо існує – замінює)
- CreateNew – створює новий файл (якщо існує – генерується виключення)
- Open - відкриває файл (якщо не існує – генерується виключення)
- OpenOrCreate – відкриває файл, або створює новий, якщо його не існує
- Truncate – відкриває файл, але всі дані всередині файлу затирає (якщо файлу не існує, генерується виключення)
static void Main(string[] args)
{
FileStream file1 = new FileStream("d:\\file1.txt", FileMode.CreateNew); //створення нового файлу
FileStream file2 = new FileStream("d:\\file2.txt", FileMode.Open); //відкриття існуючого файлу
FileStream file3 = new FileStream("d:\\file3.txt", FileMode.Append); //відкриття файлу на дозапис у кінець файлу
}
Режим доступу FileAccess:
- Read – відкриття файлу тільки на читання. При спробі запису генерується виключення
- Write - відкриття файлу тільки на запис. При спробі читання генерується виключення
- ReadWrite - відкриття файлу на читання і запис.
Читання з файлу
Для читання даних з потоку нам знадобиться клас StreamReader. У ньому реалізовано безліч методів для зручного зчитування даних. Нижче наведена програма, яка виводить вміст файлу на екран:
static void Main(string[] args)
{
FileStream file1 = new FileStream("d:\\test.txt", FileMode.Open); //створюємо файловий потік
StreamReader reader = new StreamReader(file1); // створюємо «потоковий читач» і пов'язуємо його з файловим потоком
Console.WriteLine(reader.ReadToEnd()); //зчитуємо всі дані з потоку і виводимо на екран
reader.Close(); //закриваємо потік
Console.ReadLine();
}
Метод ReadToEnd() зчитує всі дані з файлу. ReadLine () зчитує один рядок (покажчик потоку при цьому переходить на новий рядок, і при наступному виклику методу буде зчитана наступний рядок). Властивість EndOfStream вказує, чи є поточна позиція в потоці в кінці потоку (чи досягнуто кінець файлу). Повертає true або false.
Запис у файл
Для запису даних у потік використовується клас StreamWriter. Приклад запису у файл:
static void Main(string[] args)
{
FileStream file1 = new FileStream("d:\\test.txt", FileMode.Create); //створюємо файловий потік
StreamWriter writer = new StreamWriter(file1); //створюємо «потоковий письменник» і пов'язуємо його з файловим потоком
writer.Write("текст"); //записуємо в файл
writer.Close(); //закриваємо потік. Не закривши потік, у файл нічого не запишеться
}
Метод WriteLine() записує у файл порядково (те ж саме, що і проста запис за допомогою Write(), тільки в кінці додається новий рядок). Потрібно завжди пам'ятати, що після роботи з потоком, його треба закрити (звільнити ресурси), використавши метод Close().
Кодування, в якій будуть зчитуватися/записуватися дані вказується при створенні StreamReader/StreamWriter:
static void Main(string[] args)
{
FileStream file1 = new FileStream("d:\\test.txt", FileMode.Open);
StreamReader reader = new StreamReader(file1, Encoding.Unicode);
StreamWriter writer = new StreamWriter(file1, Encoding.UTF8);
}
Крім того, при використанні StreamReader і StreamWriter можна не створювати окремо файловий потік FileStream, а зробити це відразу при створенні StreamReader/StreamWriter:
static void Main(string[] args)
{
StreamWriter writer = new StreamWriter("d:\\test.txt"); //вказуємо шлях до файлу, а не потік
writer.WriteLine("текст");
writer.Close();
}
Як створити папку?
З допомогою статичного методу CreateDirectory() класу Directory:
static void Main(string[] args)
{
Directory.CreateDirectory("d:\\new_folder");
}
Як видалити папку?
Для видалення папок використовується метод Delete():
static void Main(string[] args)
{
Directory.Delete("d:\\new_folder"); //видалення пустої папки
}
Якщо папка не порожня, необхідно вказати параметр рекурсивного видалення - true:
static void Main(string[] args)
{
Directory.Delete("d:\\new_folder", true); //видалення папки, і все, що всередині
}
Автор Swytos << попередня • наступна >> До змісту