Работа с файловой системой в C#: полное руководство

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

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

Начать курс

Работа с файловой системой в 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}");
    }                

Блоги

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