Работа с файловой системой в C#: практические примеры и советы

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: зачем нужна работа с файловой системой в 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}");
}

Дополнительные рекомендации

Блоги

Рекомендаций по книгам