Файл – це набір даних, який зберігається на зовнішньому запам'ятовуючому пристрої (наприклад, на жорсткому диску). Файл має ім'я і розширення. Розширення дозволяє визначити, які дані і в якому форматі зберігаються у файлі.

Під роботою з файлами мається на увазі:
- створення файлів;
- видалення файлів;
- читання даних;
- запис даних;
- зміна параметрів файлу (ім'я, розширення...);
- інше.

В Сі-шарп є простір імен 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                                              << попереднянаступна >>                                                 До змісту


2016-05-29 • Просмотров [ 137 ]