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 там, где это возможно.
Техническая шпаргалка
| Операция | Метод | Примечание |
|---|---|---|
| Создать пустой файл | |
Возвращает 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, это как пытаться отполировать кирпич зубной щёткой: технически возможно, но вряд ли целесообразно.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ