Робота з файлами. C#
Опрацюйте теоретичний матеріал "Робота з файлами в 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 рядки - закриття файлів.