За основу взято матеріали сайту http://mycsharp.ru/post/21/2013_06_12_rabota_s_fajlami_v_si-sharp_klassy_streamreader_i_streamwriter.html
Файл - це набір даних, який зберігається на зовнішньому пристрої пам'яті (наприклад на жорсткому диску). Файл має ім'я і розширення. Розширення дозволяє ідентифікувати, які дані і в якому форматі зберігаються у файлі.
Під роботою з файлами мається на увазі:
- Створення файлів;
- Видалення файлів;
- Читання даних;
- Запис даних;
- Зміна параметрів файлу (ім'я, розширення ...);
- Інше.
У C# є простір імен System.IO, в якому реалізовані всі необхідні нам класи для роботи з файлами. Щоб підключити цей простір імен, необхідно на самому початку програми додати рядок using System.IO.
Сумісно можна використовувати простір імен System.Text, що допоможе використовувати різні кодування тексту.
Як створити файл?
Для створення порожнього файлу, в класі File є метод Create (). Він приймає один аргумент - шлях. Нижче наведений приклад створення порожнього текстового файлу new_file.txt на диску D. Якщо файл з таким ім'ям вже існує, він буде переписаний на новий порожній файл.
using System;
using System.Text;
using System.IO;
class MyPage
{
static void Main()
{
File.Create("D:\\new_file.txt");
}
}
Метод WriteAllText () створює новий файл (якщо такого немає), або відкриває існуючий і записує текст, замінюючи все, що було у файлі:
using System;
using System.Text;
using System.IO;
class MyPage
{
static void Main()
{
File. WriteAllText("D:\\new_file.txt", "текст");
}
}
Метод AppendAllText () працює, як і метод WriteAllText () за винятком того, що новий текст дописується в кінець файлу, а не переписує все що було у файлі:
static void Main(string[] args)
{
File.AppendAllText("D:\\new_file.txt", "тест метода AppendAllText ()"); //допише текст в кінець файлу
}
Як видалити файл?
Метод Delete () видаляє файл за вказаним шляхом:
static void Main()
{
File.Delete("d:\\test.txt"); //видалення файлу
}
Потоки
Крім того, щоб читати / записувати дані у файл з Сі-шарп можна використовувати потоки.
Потік - це абстрактне уявлення даних (у байтах), яке полегшує роботу з ними. В якості джерела даних може бути файл, пристрій введення-виведення, принтер.
Клас Stream є абстрактним базовим класом для всіх потокових класів у Сі-шарп. Для роботи з файлами нам знадобиться клас FileStream (файловий потік).
FileStream - представляє потік, який дозволяє виконувати операції читання / запису у файл.
static void Main()
{
FileStream file = new FileStream("d:\\test.txt", FileMode.Open, FileAccess.Read); // відкриває файл тільки на читання
}
Режими відкриття FileMode:
- Append - відкриває файл (якщо той існує) і переводить покажчик у кінець файлу (дані будуть дописуватися до кінця), або створює новий файл. Даний режим можливий тільки при режимі доступу FileAccess.Write.
- Create - створює новий файл (якщо той існує - замінює його)
- CreateNew - створює новий файл (якщо той існує - генерується "винятки")
- Open - відкриває файл (якщо той не існує - генерується "винятки")
- OpenOrCreate - відкриває файл, або створює новий, якщо його не існує
- Truncate - відкриває файл, але всі дані всередині файлу затирає (якщо файлу не існує - генерується "винятки")
static void Main ()
{
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 ()
{
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 ()
{
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 ()
{
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 ()
{
StreamWriter writer = new StreamWriter ("d:\\test.txt"); / / вказуємо шлях до файлу, а не потік
writer.WriteLine ("текст");
writer.Close ();
}
Як створити папку?
За допомогою статичного методу CreateDirectory() класу Directory:
static void Main ()
{
Directory.CreateDirectory ("d:\\new_folder");
}
Як видалити папку?
Для видалення папок використовується метод Delete():
static void Main ()
{
Directory.Delete ("d:\\new_folder"); / / видалення порожньої папки
}
Якщо папка не порожня, необхідно вказати параметр рекурсивного видалення - true:
static void Main ()
{
Directory.Delete ("d:\\new_folder", true); / / видалення папки, і всього, що всередині
}
Домашнє завдання
Завдання 1. Створіть файл numbers.txt і запишіть у нього натуральні числа від 1 до 500 через кому.
Завдання 2. Дано масив рядків: "red", "green", "black", "white", "blue". Запишіть в файл елементи масиву порядково (кожен елемент у новий рядку).
Завдання 3. Візьміть будь-який текстовий файл, і знайдіть довжину рядка у ньому .
З допомоги сайту e-olimp.com.ua
using System;
using System.IO;
public class Sum
{
private static void Main()
{
StreamReader streamReader = new StreamReader("input.txt"); // створюємо «потоковий читач» і пов'язуємо його з файловим потоком
// StreamReader reader = new StreamReader (file1); // створюємо «потоковий читач» і пов'язуємо його з файловим потоком
int ab = Convert.ToInt32(streamReader.ReadLine());
int b = ab %10;
int a = ab/10;
StreamWriter sw = new StreamWriter("output.txt"); // створюємо «потоковий письменник» і пов'язуємо його з файловим потоком
// StreamWriter writer = new StreamWriter (file1); // створюємо «потоковий письменник» і пов'язуємо його з файловим потоком
sw.WriteLine(a+" "+b);
sw.Close();
}
}