Робота з файлами. C#

Робота з файлами

View more presentations or Upload your own.

Опрацюйте теоретичний матеріал "Робота з файлами в C# " 

Робота з файлами в С#. Класи StreamReader і StreamWriter

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

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

У С# є простір імен 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"); // видалення файлу
}


Режими відкриття 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. Візьміть будь-який текстовий файл, і знайдіть в ньому розмір самої довжини рядка.
 

Приклад виконання завдання для лабораторної роботи

Завдання. Створити текстовий файл, у який записати довільне ціле число від 2 до 9 - це буде кількість елементів масиву, суму якого ми маємо знайти та результат записати до іншого текстового файлу. Масив згенерувати довільними цілими числами, що менші 25. 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// записуємо дані про кількість елементів масиву у файл kilk.txt
// його умовне iмя f1
StreamWriter f1 = File.CreateText(@"e:\kilk.txt");
Random rand = new Random();
Console.WriteLine("Введи число вiд 2 до 9");
int n = rand.Next(2, 9);
f1.WriteLine(n);
f1.Close(); //закрили файл
// читаємо дані з файлу kilk.txt
// тепер його умовне імя f2
StreamReader f2 = File.OpenText(@"e:\kilk.txt");
System.Console.WriteLine(f2.ReadLine());//виводимо n на консоль
Console.WriteLine("В масивi {0} елементiв",n);
f2.Close(); //закрили файл
int[] a = new int[n];
int s = 0;
for (int i = 0; i < n; i++)
{
a[i] = rand.Next(2, 25);
Console.WriteLine("{0} елемент {1}", i,a[i]);
s = s + a[i];
}
Console.WriteLine("Сума елементiв масиву {0} ", s);
//працюємо з текстовим файлом summa.txt
// у нього записуємо значення суми елементів
// умовне імя цього файлу f3
StreamWriter f3 = File.CreateText(@"e:\summa.txt");
f3.WriteLine(s);
f3.Close();//закрили файл
}
}
}

При необхідності створення ще й файлу, у який буде записано згенерований масив, варто доповнити програмний код:

StreamWriter ff1 = File.CreateText(@"e:\masiv.txt");
int[] a = new int[n];
int s = 0;
for (int i = 0; i < n; i++)
{
a[i] = rand.Next(2, 25);
Console.WriteLine("{0} елемент {1}", i,a[i]);
ff1.WriteLine(a[i]);
s = s + a[i];
}
ff1.Close();

Результат буде наступним:

 

Опорний приклад «Робота з текстовими файлами»

Створимо програму, яка прочитає з текстового файла три числа, уведені через пробіл та знайшовши середнє арифметичне, з точністю до сотих виведе результат до іншого текстового файлу

1          using System;

2          using System.IO;

3          namespace c_file3

4          {

5          class Program

6          {

7          public static void Main(string[] args)

8          {

9          StreamReader sr = new StreamReader ( "z:\\in.txt" );

10        StreamWriter sw = new StreamWriter ( "z:\\out.txt" );

11        string s=sr.ReadLine();

12        string [] ss = s.Split();

13        double a=Convert.ToDouble(ss[0]);

14        double b=Convert.ToDouble(ss[1]);

15        double c=Convert.ToDouble(ss[2]);

16        double average=(a+b+c)/3;

17        sw.WriteLine ("{0:f2}",average);

18        sw.Close();

19        sr.Close();

20        }

21        }

22        }

Опис:

9 рядок - створення екземпляру sr класу StreamReader для читання з файлу.

10 рядок - створення екземпляру sw класу StreamWriter для запису до файлу.

11 рядок - читання до рядкової змінної s єдиного рядка з файлу.

12 рядок - роз’єднання рядка на слова та запис їх до масиву ss.

13-15 рядки - конвертація в double перших трьох елементів масиву ss та запис в змінні

a,b,c.

16 рядок - обчислення середнього арифметичного.

17 рядок - форматований вивід середнього арифметичного до файлу.

18-19 рядки - закриття файлів.