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

Создание и удаление файлов

C# SELF
40 уровень , 0 лекция
Открыта

1. Введение

Может показаться, что файл — штука простая, и создать его проще простого: достаточно щёлкнуть правой кнопкой мыши (в Windows). Но в реальных проектах программное создание и удаление файлов — ключ к автоматизации и гибкости. Например:

  • В текстовом редакторе пользователь жмёт «Сохранить» — и ваш код создает новый файл, куда запишет труд поэта.
  • Сервис логирования событий автоматически создает файлы логов при запуске приложения.
  • Архиватор или бэкап-утилита регулярно создает временные файлы и затем их удаляет.
  • Игровое приложение на C# делает автосохранение — создает или перезаписывает save-файл.
  • А ещё вы (или ваш скрипт) автоматически очищаете папку от старых временных файлов, чтобы не захламлять диск.

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

2
Задача
C# SELF, 40 уровень, 0 лекция
Недоступна
Создание и удаление файла в папке
Создание и удаление файла в папке
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ