Файл - це набір даних, який зберігається на зовнішньому запам'ятовуючому пристрої (наприклад на жорсткому диску). Файл має ім'я і розширення. Розширення дозволяє ідентифікувати, які дані і в якому форматі зберігаються у файлі.
Під роботою з файлами мається на увазі:
- Створення файлів;
- Видалення файлів;
- Читання даних;
- Запис даних;
- Зміна параметрів файлу (ім'я, розширення ...);
- Інше.
У Сі-шарп є простір імен 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); // видалення папки, і все, що всередині
}
Домашнє завдання
Завдання 1. Створіть файл numbers.txt і запишіть в нього натуральні числа від 1 до 500 через кому.
Завдання 2. Дан масив рядків: "red", "green", "black", "white", "blue". Запишіть у файл елементи масиву підрядник (кожен елемент у новому рядку).
Завдання 3. Візьміть будь-який текстовий файл, і знайдіть в ньому розмір самої довжини рядка.