1. Вступ
Може здатися, що файл — річ проста, і створити його легше легкого: достатньо клацнути правою кнопкою миші (у Windows). Але в реальних проєктах програмне створення та видалення файлів — ключ до автоматизації та гнучкості. Наприклад:
- У текстовому редакторі користувач тисне «Зберегти» — і ваш код створює новий файл, куди запише працю поета.
- Сервіс логування подій автоматично створює файли логів під час запуску застосунку.
- Архіватор або утиліта резервного копіювання регулярно створює тимчасові файли, а потім їх видаляє.
- Ігровий застосунок на C# робить автозбереження — створює або перезаписує файл збереження.
- А ще ви (або ваш скрипт) автоматично очищуєте каталог від старих тимчасових файлів, щоб не захаращувати диск.
Уміння автоматично створювати й видаляти файли — одна з базових навичок сучасного .NET-розробника.
2. Швидкі операції через File
Створення файлу
Є кілька способів створити файл у C#. Найшвидший і найпростіший шлях — використати статичний клас File. Спробуймо:
// Створимо порожній файл "myfile.txt" у поточному каталозі
File.Create("myfile.txt").Close(); // FileStream потрібно закрити!
Console.WriteLine("Файл 'myfile.txt' створено.");
Важливий нюанс:
Метод File.Create повертає об’єкт FileStream, який треба закрити (Close()), щоб ОС не скаржилася, що файл «зайнятий». Без закриття деякі інші операції з цим самим файлом можуть раптово не спрацювати. Це вічна класика: "Файл зайнятий іншим процесом", хоча цей «інший процес» — це все ще ваша ж програма, яка не закрила потік.
Якщо файл уже існував, File.Create його перезапише (старий видаляється, новий порожній створюється на його місці). Якщо ж файлу не було — він зʼявиться.
І який сенс від порожнього файлу?
Найчастіше новий файл потрібен не як порожня заготовка, а щоб туди щось записати. Для цього є зручні методи:
File.WriteAllText("welcome.txt", "Привіт, світе файлів!");
Команда створить файл, запише в нього рядок і чемно зачинить за собою двері (файл), щоб нічого поганого не сталося.
Перевірка існування файлу
Перш ніж створювати новий файл, корисно перевірити, а раптом він уже існує. Інакше ризикуєте випадково стерти щось важливе.
if (!File.Exists("important.txt"))
{
File.WriteAllText("important.txt", "Зберігаємо важливу інформацію.");
Console.WriteLine("Файл створено.");
}
else
{
Console.WriteLine("Такий файл вже є, можна вигадати щось інше!");
}
3. Приклад із життя: «Зберігаємо привітання користувача»
Console.Write("Введіть своє імʼя: ");
string name = Console.ReadLine();
string filename = $"{name}_greeting.txt";
string message = $"Ласкаво просимо, {name}!";
// Перевіряємо, чи є такий файл
if (!File.Exists(filename))
{
File.WriteAllText(filename, message);
Console.WriteLine($"Персональний файл привітання {filename} створено.");
}
else
{
Console.WriteLine($"Файл {filename} вже існує! Перезаписати? (y/n)");
string answer = Console.ReadLine();
if (answer?.ToLower() == "y")
{
File.WriteAllText(filename, message);
Console.WriteLine($"Файл {filename} перезаписано.");
}
else
{
Console.WriteLine("Залишаємо все як є.");
}
}
Що ми тут робимо:
- Перевіряємо, чи існує файл (File.Exists).
- Якщо його немає — створюємо та записуємо текст (File.WriteAllText).
- Якщо він є — питаємо користувача, перезаписувати чи ні.
4. Видалення файлу
Видаляти файли в C# — справа майже хакерська… але безпечна! Тут теж усе просто:
Використовуємо File.Delete
File.Delete("myfile.txt");
Якщо файлу немає — жодних драм! Просто нічого не станеться (помилок не буде, якщо шлях коректний).
Пастки для новачків
- Якщо файл уже відкритий вашою ж програмою (або кимось іншим), буде згенеровано виняток.
- Якщо шлях вказано з помилкою — виникне ArgumentException.
Рекомендація: завжди перевіряти існування
if (File.Exists("victim.txt"))
{
File.Delete("victim.txt");
Console.WriteLine("Файл видалено.");
}
else
{
Console.WriteLine("Видаляти нічого — такого файлу не знайдено.");
}
5. Каталоги й файли: створюємо файлову структуру
Створення файлу в каталозі
string folder = "Data";
Directory.CreateDirectory(folder); // якщо каталогу немає — його буде створено
string filename = Path.Combine(folder, "info.txt");
File.WriteAllText(filename, "Тут зберігається секретне повідомлення!");
Важливо: Під час спроби створити файл у неіснуючому каталозі буде згенеровано виняток. Тому правильно спочатку викликати Directory.CreateDirectory(folder). Цей метод не створить каталог повторно, якщо той уже є, тож виклик безпечний.
6. Робота з екземплярами: FileInfo
Для «олдскульних» і трохи більш просунутих сценаріїв стане у пригоді клас FileInfo:
FileInfo fi = new FileInfo("example.txt");
// Створити новий файл (як і File.Create — створює порожній файл)
using (var fs = fi.Create())
{
// можна щось записати за потреби
}
Console.WriteLine($"Файл 'example.txt' створено за допомогою FileInfo.");
Видалення через FileInfo:
FileInfo fi = new FileInfo("oldfile.txt");
if (fi.Exists)
{
fi.Delete();
Console.WriteLine("Файл видалено через FileInfo.");
}
Переваги FileInfo
Якщо ви збираєтеся працювати не лише зі створенням/видаленням, а й часто звертатися до властивостей файлу або виконувати з ним різні дії, екземплярний підхід дасть виграш у зручності (а інколи й у продуктивності).
7. Створюємо та чистимо «технічні файли»
Нехай застосунок накопичує тимчасові файли в каталозі "temp_data", і ми хочемо видалити всі файли в цьому каталозі, назви яких починаються з "temp_".
string tempFolder = "temp_data";
Directory.CreateDirectory(tempFolder);
for (int i = 1; i <= 5; i++)
{
string tempFile = Path.Combine(tempFolder, $"temp_{i}.txt");
File.WriteAllText(tempFile, $"Тестові дані {i}");
}
Console.WriteLine("Створено 5 тимчасових файлів.");
// Тепер видалимо всі temp_*.txt
foreach (string file in Directory.GetFiles(tempFolder, "temp_*.txt"))
{
File.Delete(file);
Console.WriteLine($"Видалено файл: {file}");
}
Чудово працює для автоматичного прибирання старих і тимчасових файлів.
8. Важливі деталі: винятки та безпека
Що може піти не так:
- Немає прав на запис/видалення в каталозі (наприклад, C:\Windows)
- Файл уже зайнятий іншою програмою (або вашою!)
- Шлях містить недопустимі символи (наприклад, *?<>)
- Файл видалено іншим процесом між вашою перевіркою та видаленням (так, таке буває!)
Як захиститися
У «бойовому» коді такі операції завжди варто обгортати в блок try-catch:
try
{
File.Delete("trickyfile.txt");
Console.WriteLine("Файл видалено.");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine("Немає прав на видалення файлу.");
}
catch (IOException ex)
{
Console.WriteLine("Файл може бути зайнятий іншим процесом.");
}
catch (Exception ex)
{
Console.WriteLine($"Помилка: {ex.Message}");
}
9. Корисні нюанси
Файли, які завжди під контролем
- Використовуйте Path.Combine для складання шляхів. Так не буде проблем із зайвими або відсутніми косими рисками, і ваш код буде кросплатформним.
- Перевіряйте існування файлу перед створенням/видаленням, якщо не хочете сюрпризів.
- Огорніть свій код у try-catch, якщо працюєте у «бойовому» та, особливо, «багатокористувацькому» застосунку.
- Для частих операцій над одним і тим самим файлом використовуйте FileInfo, для разової операції — File.
- Не тримайте файли відкритими довше, ніж потрібно. У вас відкритий файл? Запитайте себе: "А чому?" і закрийте його! Використовуйте using там, де це можливо.
Технічна шпаргалка
| Операція | Метод | Примітка |
|---|---|---|
| Створити порожній файл | |
Повертає FileStream, його треба закрити |
| Записати текст у файл | |
Створює файл або перезаписує |
| Перевірити існування | |
Повертає bool |
| Видалити файл | |
Не кидає виняток, якщо файлу немає |
| Створити файл у каталозі | |
Гарантує наявність каталогу |
| Робота з FileInfo | |
Для багатьох операцій |
10. Типові помилки під час роботи з файлами
Помилка № 1: забувають закрити потік після File.Create.
Багато новачків створюють файл за допомогою File.Create, але не закривають повернутий потік. У результаті інший код перестає «бачити» файл — ніби він пішов у паралельний всесвіт. Закривайте потік явно (Close()) або через конструкцію using.
Помилка № 2: намагаються створити файл у неіснуючому каталозі.
Типова пастка — спроба створити файл у каталозі, якого ще немає. Не забувайте викликати Directory.CreateDirectory завчасно. Це абсолютно безпечно: нічого «зайвого» не створиться, а потрібний каталог з’явиться.
Помилка № 3: видаляють файл без перевірки.
Іноді хочеться просто викликати File.Delete, не перевіряючи наявність файлу. Це допустимо — метод не видасть помилку, якщо файлу немає. Але якщо шлях задано з помилкою або немає доступу — виняток гарантовано. Краще передбачити й обробити його.
Помилка № 4: плутають File.Delete і Directory.Delete.
File.Delete працює лише для файлів, а Directory.Delete — для каталогів. Якщо спробувати видалити каталог за допомогою File.Delete, це як намагатися відполірувати цеглину зубною щіткою: технічно можливо, але навряд чи доцільно.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ