Введение: зачем нужна работа с файловой системой в C#
Любое серьезное приложение рано или поздно сталкивается с необходимостью сохранения данных. Будь то конфигурационные файлы, логи, пользовательские документы или временные данные — работа с файловой системой является фундаментальным навыком для C#-разработчика. В этой статье мы на практических примерах разберем, как создавать, читать, записывать и управлять файлами и папками с помощью .NET. Вы научитесь не только базовым операциям, но и узнаете о лучших практиках обработки исключений и работе с потоками.
Основные классы для работы с файловой системой
В .NET для взаимодействия с файловой системой используются пространства имен System.IO и System.IO.Enumeration. Ключевые классы, которые вам понадобятся:
File— статические методы для создания, копирования, удаления и перемещения файлов.FileInfo— экземплярный класс для работы с конкретным файлом (поддерживает те же операции, но требует создания объекта).Directory— статические методы для работы с каталогами.DirectoryInfo— экземплярный класс для работы с каталогами.Path— утилитный класс для работы с путями (объединение, получение расширения, имени и т.д.).FileStream— низкоуровневый поток для чтения/записи байтов.StreamReader/StreamWriter— высокоуровневые обертки для работы с текстом.
Выбор между статическими методами и экземплярными классами зависит от сценария. Если вам нужно выполнить одну операцию — используйте File или Directory. Если планируется несколько операций над одним объектом — создайте FileInfo или DirectoryInfo.
Создание, чтение и запись файлов
1. Создание и запись текстового файла
Самый простой способ записать текст в файл — использовать метод File.WriteAllText. Он создает файл (или перезаписывает существующий) и закрывает поток автоматически.
using System.IO;
string path = @"C:\temp\example.txt";
string content = "Привет, мир! Это тестовый файл.";
File.WriteAllText(path, content);
Console.WriteLine("Файл создан и записан.");
Если нужно добавить данные в конец файла, используйте File.AppendAllText:
File.AppendAllText(path, "\nДобавленная строка.");
2. Чтение файла
Для чтения всего текста используйте File.ReadAllText:
string readContent = File.ReadAllText(path);
Console.WriteLine(readContent);
Если файл большой, лучше читать построчно через File.ReadLines (возвращает IEnumerable<string>):
foreach (string line in File.ReadLines(path))
{
Console.WriteLine(line);
}
3. Работа с бинарными файлами
Для бинарных данных (изображения, архивы) используйте FileStream или BinaryReader/BinaryWriter. Пример записи массива байтов:
byte[] data = { 0x48, 0x65, 0x6C, 0x6C, 0x6F }; // "Hello"
File.WriteAllBytes(@"C:\temp\binary.dat", data);
byte[] readData = File.ReadAllBytes(@"C:\temp\binary.dat");
Console.WriteLine(BitConverter.ToString(readData)); // 48-65-6C-6C-6F
Работа с папками и управление файлами
1. Создание и удаление папок
Создать папку можно с помощью Directory.CreateDirectory. Метод создает все недостающие папки в пути:
string dirPath = @"C:\temp\MyApp\Logs";
Directory.CreateDirectory(dirPath);
Console.WriteLine("Папка создана.");
Удаление папки (рекурсивное, со всем содержимым):
if (Directory.Exists(dirPath))
{
Directory.Delete(dirPath, recursive: true);
Console.WriteLine("Папка удалена.");
}
2. Перемещение и копирование файлов
string sourceFile = @"C:\temp\example.txt";
string destFile = @"C:\temp\backup\example_backup.txt";
// Копирование (третий параметр — перезаписывать ли существующий файл)
File.Copy(sourceFile, destFile, overwrite: true);
// Перемещение
File.Move(sourceFile, @"C:\temp\archive\example.txt");
3. Получение информации о файлах и папках
Используйте FileInfo и DirectoryInfo для получения метаданных:
FileInfo fileInfo = new FileInfo(@"C:\temp\example.txt");
Console.WriteLine($"Размер: {fileInfo.Length} байт");
Console.WriteLine($"Дата создания: {fileInfo.CreationTime}");
Console.WriteLine($"Расширение: {fileInfo.Extension}");
DirectoryInfo dirInfo = new DirectoryInfo(@"C:\temp");
foreach (FileInfo fi in dirInfo.GetFiles("*.txt"))
{
Console.WriteLine($"Файл: {fi.Name}, размер: {fi.Length}");
}
Обработка исключений и best practices
Работа с файловой системой всегда сопряжена с риском исключений. Вот самые частые из них:
DirectoryNotFoundException— указанный путь не существует.UnauthorizedAccessException— недостаточно прав.IOException— общая ошибка ввода-вывода (например, файл занят другим процессом).PathTooLongException— путь превышает допустимую длину.
Всегда используйте блоки try-catch и проверяйте существование файла/папки перед операцией:
string path = @"C:\temp\data.txt";
try
{
if (File.Exists(path))
{
string content = File.ReadAllText(path);
Console.WriteLine(content);
}
else
{
Console.WriteLine("Файл не найден.");
}
}
catch (UnauthorizedAccessException)
{
Console.WriteLine("Нет доступа к файлу.");
}
catch (IOException ex)
{
Console.WriteLine($"Ошибка ввода-вывода: {ex.Message}");
}
Дополнительные рекомендации