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/macOS.
4. Як видалити папку? Метод Directory.Delete
Видалення папки — майже таке саме просте, як створення. Але є нюанси.
Directory.Delete("Reports");
Якщо папка існує й порожня — її видалять спокійно. Але якщо всередині щось є, буде згенеровано виняток:
System.IO.IOException: "The directory is not empty."
А якщо треба видалити папку з вмістом?
Для цього є перевантаження методу — з параметром recursive: true:
Directory.Delete("Reports", recursive: true);
УВАГА: Рекурсивне видалення безповоротно знищує все всередині папки. Якщо вкажете не той каталог, можна втратити важливі дані. Завжди двічі перевіряйте шлях!
Приклад
Додамо можливість видалення папки користувача (наприклад, якщо користувач видалив свій обліковий запис):
// Питаємо, чи потрібно видалити
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);
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ