1. Введение
Представьте, что вы пишете программу, в которую пользователь загружает свои фотографии. Хорошо бы хранить их не просто "кучей" в одной папке, а создавать отдельные директории — хоть по дате, хоть по имени пользователя. Или, скажем, ваша программа генерирует отчёты: разумно складывать результаты в выделенную директорию, которую тоже нужно создать на лету. А удалить временные папки после работы — вообще обязанность порядочного кода (и избавление для пользователя от мусора).
Работа с директориями — стандартная задача во множестве приложений: от резервного копирования до игр, которые хотят разложить свои сейвы по папочкам. На собеседованиях эта тема тоже часто встречается, потому что здесь важно понимать не только, что есть команда "создать" или "удалить", но и как она себя ведёт в нестандартных ситуациях.
Директория (или папка) — это, по сути, контейнер для других файлов и директорий в файловой системе. Директории образуют древовидную структуру (filesystem tree): у каждой папки есть родитель, кроме самой верхней (корня), и могут быть дочерние папки — хоть по тысяче штук.
2. Как создать папку? Статический класс Directory
Самый простой способ создать папку — воспользоваться статическим методом Directory.CreateDirectory. Не нужно создавать никаких объектов, просто передайте путь:
using System.IO;
// Создаём папку "Reports" в текущей директории
Directory.CreateDirectory("Reports");
Если такая папка уже есть, метод ничего не делает и не бросает ошибку — можно смело вызывать CreateDirectory, не думая, существует ли эта папка.
Давайте попробуем подставить более сложный путь, например, создать и вложенную папку:
Directory.CreateDirectory(@"Data\Photos\2024\June");
Этот вызов создаст всю цепочку директорий, если каких-то промежуточных папок не существовало. Это называется рекурсивным созданием — Directory.CreateDirectory позаботится о всём сам.
Важно! В пути к директориям используйте либо двойной обратный слэш (\\) для Windows, либо прямой (/). Ещё лучше — Path.Combine, о котором мы говорили ранее.
А что возвращает CreateDirectory?
Метод возвращает объект типа DirectoryInfo. Это удобно, если вы сразу хотите работать с этой директорией:
DirectoryInfo reportsDir = Directory.CreateDirectory("Reports");
Console.WriteLine($"Создана папка: {reportsDir.FullName}");
Как узнать, существует ли папка?
В любой ситуации, когда вы хотите совершить операцию с директорией, хорошо бы убедиться, что она существует. Для этого есть статический метод:
bool exists = Directory.Exists("Reports");
if (!exists)
{
Console.WriteLine("Папка не найдена, сейчас создадим!");
Directory.CreateDirectory("Reports");
}
Памятка: Не обязательно делать предварительную проверку перед созданием: метод ничего не сломает, если папка есть. Но если вы хотите показать пользователю красивое сообщение или вести логику по-разному, этот способ пригодится.
3. Создание директорий: практические кейсы
Давайте подружим эти знания с нашим учебным приложением. Предположим, мы ведём учёт записей пользователей и хотим хранить для каждого отдельную папку:
// Добавим System.IO наверх файла, если его нет
using System.IO;
Console.Write("Введите имя пользователя: ");
string userName = Console.ReadLine() ?? "Unknown";
// Собираем путь к папке пользователя
string basePath = "UsersData";
string userPath = Path.Combine(basePath, userName);
// Создаём папку для пользователя (и родительскую, если нужно)
Directory.CreateDirectory(userPath);
Console.WriteLine($"Папка для пользователя \"{userName}\" готова: {Path.GetFullPath(userPath)}");
Пример выше создаст структуру файлов (если её не было):
UsersData/
└── ИмяПользователя/
Совет: всегда используйте Path.Combine, если компонуете кусочки путей — так ваш код будет работать и на Windows, и на Linux/Mac.
4. Как удалить папку? Метод Directory.Delete
Удаление папки — это почти так же просто, как создание. Но есть нюансы.
Directory.Delete("Reports");
Если папка существует и пуста — её удалят спокойно. Но если внутри неё что-то лежит, будет выброшено исключение:
System.IO.IOException: "The directory is not empty."
А если нужно удалить папку с содержимым?
Для этого есть перегрузка метода — с параметром recursive: true:
Directory.Delete("Reports", recursive: true);
ВНИМАНИЕ: Recursive‑удаление безвозвратно уничтожает всё внутри папки. Если укажете не ту директорию, можно потерять важные данные. Всегда дважды проверяйте путь!
Пример
Добавим возможность удаления папки пользователя (например, если пользователь удалил свой аккаунт):
// Спрашиваем, нужно ли удалить
Console.Write("Удалить папку пользователя? (y/n): ");
string input = Console.ReadLine() ?? "";
if (input.ToLower() == "y")
{
if (Directory.Exists(userPath))
{
// Удаляем вместе со всем содержимым
Directory.Delete(userPath, recursive: true);
Console.WriteLine("Папка пользователя удалена!");
}
else
{
Console.WriteLine("Папка уже не существует.");
}
}
5. Таблица: Основные методы работы с папками
| Операция | Метод | Особенности |
|---|---|---|
| Создать папку | |
Рекурсивно создаёт все папки по пути |
| Проверить существование | |
Возвращает true или false |
| Удалить пустую папку | |
Бросает ошибку, если папка не пуста |
| Удалить папку с содержимым | |
Безвозвратно стирает всё внутри |
| Получить список файлов | |
Возвращает имена файлов |
| Получить список подпапок | |
Возвращает имена директорий |
6. Неочевидные моменты и типичные ошибки
Ошибка при создании: если нет прав или путь некорректен
Если вы пытаетесь создать папку в системных директориях (например, "C:\Windows\System32\SuperApp"), скорее всего получите исключение UnauthorizedAccessException или IOException.
Подручные советы:
Всегда обрабатывайте ошибки с помощью try-catch, если работаете с внешними папками (например, на флешке пользователя или сетевом диске).
Не доверяйте вводимым путям напролом.
try
{
Directory.CreateDirectory(pathFromUser);
}
catch (Exception ex)
{
Console.WriteLine($"Не удалось создать папку: {ex.Message}");
}
Удаление папки, если она используется другим процессом
Если кто-то (или ваша же программа) открыл файл из папки и держит его открытым, при попытке удалить папку получите IOException — "не удается удалить, папка используется". Сначала закройте все файлы внутри папки.
Директория не пуста, а вы забыли про recursive: true
Очень частая проблема. Если не передать recursive: true, а папка не пуста — получите исключение.
Используйте абсолютные пути для критичных операций
Работа с относительными путями ("Reports") всегда идёт относительно текущей рабочей директории приложения. Если программа запущена из другого места, папка создастся не там, где вы ждёте. Проверяйте, откуда запускается ваш код, или сразу указывайте полный путь:
string fullPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "MyAppData");
Directory.CreateDirectory(fullPath);
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ