Работа с файловой системой в C#: от основ до продвинутых техник
Работа с файловой системой — одна из ключевых задач при разработке любого приложения. В C# (.NET) для этих целей существует мощное пространство имен System.IO, которое предоставляет разработчику полный набор инструментов для создания, чтения, записи, перемещения и удаления файлов и папок. В этой статье мы подробно разберем все основные операции с файловой системой, начиная с простых примеров и заканчивая продвинутыми техниками обработки данных.
Основы работы с файлами в C#
Пространство имен System.IO включает классы File и FileInfo, которые предоставляют статические и экземплярные методы для управления файлами. Рассмотрим основные операции.
Чтение и запись текстовых файлов
Самый простой способ работы с текстовыми файлами — использование статических методов класса File:
using System.IO;
// Запись текста в файл (создает новый файл или перезаписывает существующий)
string content = "Привет, мир! Это пример работы с файлами в C#.";
File.WriteAllText(@"C:\temp\example.txt", content);
// Чтение всего текста из файла
string readContent = File.ReadAllText(@"C:\temp\example.txt");
Console.WriteLine(readContent);
// Дозапись в конец файла
File.AppendAllText(@"C:\temp\example.txt", "\nНовая строка добавлена.");
Работа с бинарными файлами
Для работы с бинарными данными используйте File.ReadAllBytes и File.WriteAllBytes:
byte[] binaryData = new byte[] { 0x48, 0x65, 0x6C, 0x6C, 0x6F };
File.WriteAllBytes(@"C:\temp\binary.bin", binaryData);
byte[] readBinary = File.ReadAllBytes(@"C:\temp\binary.bin");
Console.WriteLine(string.Join(", ", readBinary)); // Вывод: 72, 101, 108, 108, 111
Проверка существования файла и его удаление
Перед выполнением операций с файлами всегда полезно проверять их существование:
string filePath = @"C:\temp\example.txt";
if (File.Exists(filePath))
{
Console.WriteLine("Файл существует. Удаляем...");
File.Delete(filePath);
Console.WriteLine("Файл удален.");
}
else
{
Console.WriteLine("Файл не найден.");
}
Работа с директориями в C#
Для управления папками используются классы Directory и DirectoryInfo. Они позволяют создавать, перемещать, переименовывать и удалять директории, а также получать информацию о них.
Создание и удаление папок
string dirPath = @"C:\temp\MyNewFolder";
// Создание папки (если она уже существует, исключение не выбрасывается)
Directory.CreateDirectory(dirPath);
// Проверка существования
if (Directory.Exists(dirPath))
{
Console.WriteLine("Папка создана успешно.");
}
// Удаление папки (второй параметр - удалять ли рекурсивно)
Directory.Delete(dirPath, recursive: true);
Console.WriteLine("Папка удалена.");
Получение списка файлов и подпапок
Методы GetFiles и GetDirectories позволяют получить содержимое директории:
string targetDir = @"C:\temp";
// Получение всех файлов в директории
string[] files = Directory.GetFiles(targetDir);
Console.WriteLine("Файлы в директории:");
foreach (string file in files)
{
Console.WriteLine($" {Path.GetFileName(file)}");
}
// Получение всех подпапок
string[] subDirs = Directory.GetDirectories(targetDir);
Console.WriteLine("Подпапки:");
foreach (string dir in subDirs)
{
Console.WriteLine($" {Path.GetFileName(dir)}");
}
// Поиск по шаблону (например, все текстовые файлы)
string[] txtFiles = Directory.GetFiles(targetDir, "*.txt");
Console.WriteLine($"Найдено {txtFiles.Length} текстовых файлов.");
Работа с DirectoryInfo
Класс DirectoryInfo предоставляет экземплярные методы и свойства для работы с конкретной папкой:
DirectoryInfo dirInfo = new DirectoryInfo(@"C:\temp");
if (dirInfo.Exists)
{
Console.WriteLine($"Имя: {dirInfo.Name}");
Console.WriteLine($"Полный путь: {dirInfo.FullName}");
Console.WriteLine($"Родительская папка: {dirInfo.Parent?.Name}");
Console.WriteLine($"Дата создания: {dirInfo.CreationTime}");
Console.WriteLine($"Дата последнего изменения: {dirInfo.LastWriteTime}");
// Получение всех файлов с информацией о них
FileInfo[] fileInfos = dirInfo.GetFiles();
foreach (FileInfo fi in fileInfos)
{
Console.WriteLine($"{fi.Name} - {fi.Length} байт - создан {fi.CreationTime}");
}
}
Продвинутые методы работы с файловой системой
Когда простых методов недостаточно, на помощь приходят классы FileStream, StreamReader и StreamWriter, а также класс Path для работы с путями.
Использование FileStream для чтения и записи
FileStream позволяет работать с файлами на низком уровне, управляя буферизацией и позицией чтения/записи:
string filePath = @"C:\temp\data.bin";
// Запись с использованием FileStream
using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
byte[] data = System.Text.Encoding.UTF8.GetBytes("Пример данных для записи");
fs.Write(data, 0, data.Length);
Console.WriteLine("Данные записаны.");
}
// Чтение с использованием FileStream
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
string content = System.Text.Encoding.UTF8.GetString(buffer);
Console.WriteLine($"Прочитано: {content}");
}
Построчное чтение с StreamReader и запись с StreamWriter
Для работы с большими текстовыми файлами удобно использовать StreamReader и StreamWriter:
string filePath = @"C:\temp\lines.txt";
// Запись строк
using (StreamWriter writer = new StreamWriter(filePath))
{
writer.WriteLine("Первая строка");
writer.WriteLine("Вторая строка");
writer.WriteLine("Третья строка");
}
// Построчное чтение
using (StreamReader reader = new StreamReader(filePath))
{
string line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine($"Строка: {line}");
}