Практическое занятие № 15
Тема: Основы обработки данных в файлах
Цель работы: изучить методы и техники обработки данных, хранящихся в различных форматах файлов.
Краткие теоретические сведения
В C# для работы с файлами предназначена пара классов File и FileInfo. С их помощью мы можем создавать, удалять, перемещать файлы, получать их свойства и многое другое.
FileInfo
Некоторые полезные методы и свойства класса FileInfo:
CopyTo(path): копирует файл в новое место по указанному пути path
Create(): создает файл
Delete(): удаляет файл
MoveTo(destFileName): перемещает файл в новое место
Свойство Directory: получает родительский каталог в виде объекта DirectoryInfo
Свойство DirectoryName: получает полный путь к родительскому каталогу
Свойство Exists: указывает, существует ли файл
Свойство Length: получает размер файла
Свойство Extension: получает расширение файла
Свойство Name: получает имя файла
Свойство FullName: получает полное имя файла
Для создания объекта FileInfo применяется конструктор, который получает в качестве параметра путь к файлу:
FileInfo fileInf = new FileInfo(@"C:\app\content.txt");
File
Класс File реализует похожую функциональность с помощью статических методов:
Copy(): копирует файл в новое место
Create(): создает файл
Delete(): удаляет файл
Move: перемещает файл в новое место
Exists(file): определяет, существует ли файл
Пути к файлам
Для работы с файлами можно применять как абсолютные, так и относительные пути:
Абсолютные пути
string path1 = @"C:\Users\eugene\Documents\content.txt"; // для Windows
string path2 = "C:\\Users\\eugene\\Documents\\content.txt"; // для Windows
string path3 = "/Users/eugene/Documents/content.txt"; // для MacOS/Linux
Относительные пути
string path4 = "MyDir\\content.txt"; // для Windows string path5 = "MyDir/content.txt"; // для MacOS/Linux
Получение информации о файле
string path = @"C:\Users\eugene\Documents\content.txt"; FileInfo fileInfo = new FileInfo(path);
if (fileInfo.Exists)
{
Console.WriteLine($"
мя фай
а: {fileInfo. Name}"); Console.WriteLine($"Время создан
я: {fileInfo.CreationTime}"); Console.WriteLine($"Размер: {fileInfo.Length}");
}
Удаление файла
string path = @"C:\app\content.txt"; FileInfo fileInf = new FileInfo(path); if (fileInf.Exists)
{
fileInf.Delete();
// а
ьтернат
ва с помощью к
асса File
// File.Delete(path);
}
Перемещение файла
string path = @"C:\OldDir\content.txt"; string newflath = @"C:\
ewDir\index.txt"; FileInfo fileInf = new FileInfo(path); if (fileInf.Exists)
{
fileInf.MoveTo(newflath);
// а
ьтернат
ва с помощью к
асса File
// File.Move(path, newflath);
}
Если файл по новому пути уже существует, то с помощью дополнительного параметра можно указать, надо ли перезаписать файл (при значении true файл перезаписывается)
string path = @"C:\OldDir\content.txt"; string newflath = @"C:\
ewDir\index.txt"; FileInfo fileInf = new FileInfo(path); if (fileInf.Exists)
{
fileInf.MoveTo(newflath, true);
// а
ьтернат
ва с помощью к
асса File
// File.Move(path, newflath, true);
}
Копирование файла
string path = @"C:\OldDir\content.txt"; string newflath = @"C:\
ewDir\index2.txt"; FileInfo fileInf = new FileInfo(path);
if (fileInf.Exists)
{
fileInf.CopyTo(newflath, true);
// альтернатива с помощью к
асса File
// File.Copy(path, newflath, true);
}
Метод CopyTo класса FileInfo принимает два параметра: путь, по которому файл будет копироваться, и булевое значение, которое указывает, надо ли при копировании перезаписывать файл (если true, как в случае выше, файл при копировании перезаписывается). Если же в качестве последнего параметра
передать значение false, то если такой файл уже существует, приложение выдаст ошибку.
Метод Copy класса File принимает три параметра: путь к исходному файлу, путь, по которому файл будет копироваться, и булевое значение, указывающее, будет ли файл перезаписываться.
Чтение и запись файлов
В дополнение к вышерассмотренным методам класс File также предоставляет ряд методов для чтения-записи текстовых и бинарных файлов:
AppendAllLines(String, IEnumerable) / AppendAllLinesAsync(String, IEnumerable, CancellationToken)
добавляют в файл набор строк. Если файл не существует, то он создается
AppendAllText(String, String) / AppendAllTextAsync(String, String, CancellationToken)
добавляют в файл строку. Если файл не существует, то он создается
byte[] ReadAllBytes (string path) / Task ReadAllBytesAsync (string path, CancellationToken cancellationToken)
считывают содержимое бинарного файла в массив байто
string[] ReadAllLines (string path) / Task ReadAllLinesAsync (string path, CancellationToken cancellationToken)
считывают содержимое текстового файла в массив строк
string ReadAllText (string path) / Task ReadAllTextAsync (string path, CancellationToken cancellationToken)
считывают содержимое текстового файла в строку
IEnumerable ReadLines (string path)
считывают содержимое текстового файла в коллекцию строк
void WriteAllBytes (string path, byte[] bytes) / Task WriteAllBytesAsync (string path, byte[] bytes, CancellationToken cancellationToken)
записывают массив байт в бинарный файл. Если файл не существует, он создается. Если существует, то перезаписывается
void WriteAllLines (string path, string[] contents) / Task WriteAllLinesAsync (string path, IEnumerable contents, CancellationToken cancellationToken)
записывают массив строк в текстовый файл. Если файл не существует, он создается. Если существует, то перезаписывается
WriteAllText (string path, string? contents) / Task WriteAllTextAsync (string path, string? contents, CancellationToken cancellationToken)
записывают строку в текстовый файл. Если файл не существует, он создается. Если существует, то перезаписывается
Как видно, эти методы покрывают практически все основные сценарии - чтение и запись текстовых и бинарных файлов. Причем в зависимости от задачи можно применять как синхронные методы, так и их асинхронные аналоги.
Например, запишем и считаем обратно в строку текстовый файл:
string path = @"c:\app\content.txt"; string originalText = "
ello Metanit.com";
// запись строк
await File.WriteAllTextAsync(path, originalText);
// дозапись в конец фай
а
await File.AppendAllTextAsync(path, "\n Hello work");
// чтение фай
а
string fileText = await File.ReadAllTextAsync(path); Console.WriteLine(fileText);
Консольный вывод:
Стоит отметить, что при добавлении текста я добавил в строку
последовательность "\n", которая выполняет перевод на следующую строку. Благодаря этому добавляемый текст располагается в файле на новой строке.
Если мы хотим, что в файле изначально шло добавление на новую строку, то для записи стоит использовать метод WriteAllLines/ WriteAllLinesAsync, а для добавления - AppendAllLines / AppendAllLinesAsync
await File.WriteAllLinesAsync(path, new[] { "Hello Metanit.com", "Hello work" });
Аналогично при чтении файла если мы хотим каждую строку файла считать
отдельно, то вместо ReadAllText / ReadAllTextAsync применяется ReadAllLines / ReadAllLinesAsync.
Кодировка
В качестве дополнительного параметра методы чтения-записи текстовых файлов позволяют установить кодировку в виде объекта System.Text.Encoding:
using System.Text;
string path = "/Users/eugene/Documents/app/content.txt"; string originalText = "Привет Metanit.com";
// запись строк
await File.WriteAllTextAsync(path, originalText, Encoding.Unicode);
// дозап
сь в конец фай
а
await File.AppendAllTextAsync(path, "\n Привет мир", Encoding.Unicode);
// чтение фай
а
string fileText = await File.ReadAllTextAsync(path, Encoding.Unicode); Console.WriteLine(fileText);
Для установки кодировки при записи и чтении здесь применяется встроенное значение Encoding.Unicode. Также можно указать название кодировки, единственное следует удостовериться, что текущая операционная система поддерживает выбранную кодировку:
using System.Text;
string path = @"c:\app\content.txt"; string originalText = "Hello Metanit.com";
// запись строк
await File.WriteAllTextAsync(path, originalText, Encoding.GetEncoding("iso-8859-1"));
// дозапись в конец фай
а
await File.AppendAllTextAsync(path, "\n Hello code", Encoding.GetEncoding("iso-8859-1"));
// чтене фай
а
string fileText = await File.ReadAllTextAsync(path, Encoding.GetEncoding("iso-8859-1")); Console.WriteLine(fileText);
Задание
Создайте программу и реализуйте в ней функционал классов File и
FileInfo
Контрольные вопросы:
Что такое обработка данных в файлах?
Какие основные операции можно выполнять с данными в файлах?