JavaRush /Курси /C# SELF /Створення і видалення файлів

Створення і видалення файлів

C# SELF
Рівень 40 , Лекція 0
Відкрита

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 там, де це можливо.

Технічна шпаргалка

Операція Метод Примітка
Створити порожній файл
File.Create
Повертає FileStream, його треба закрити
Записати текст у файл
File.WriteAllText
Створює файл або перезаписує
Перевірити існування
File.Exists
Повертає bool
Видалити файл
File.Delete
Не кидає виняток, якщо файлу немає
Створити файл у каталозі
Directory.CreateDirectory + File.WriteAllText
Гарантує наявність каталогу
Робота з FileInfo
new FileInfo(path).Create / Delete / Exists
Для багатьох операцій

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, це як намагатися відполірувати цеглину зубною щіткою: технічно можливо, але навряд чи доцільно.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ