Какой простейший/канонический способ создания пустого файла в С#/. NET?
Самый простой способ, который я смог найти, - это:
System.IO.File.WriteAllLines(filename, new string[0]);
Какой простейший/канонический способ создания пустого файла в С#/. NET?
Самый простой способ, который я смог найти, - это:
System.IO.File.WriteAllLines(filename, new string[0]);
Использование только File.Create
оставит файл открытым, что, вероятно, не является тем, что вы хотите.
Вы можете использовать:
using (File.Create(filename)) ;
Это выглядит немного странно, заметьте. Вместо этого вы можете использовать фигурные скобки:
using (File.Create(filename)) {}
Или просто вызовите Dispose
напрямую:
File.Create(filename).Dispose();
В любом случае, если вы собираетесь использовать это в более чем одном месте, вам, вероятно, следует рассмотреть возможность его переноса в вспомогательный метод, например
public static void CreateEmptyFile(string filename)
{
File.Create(filename).Dispose();
}
Обратите внимание, что вызов Dispose
непосредственно вместо использования оператора using
на самом деле не имеет большого значения здесь, насколько я могу судить - единственный способ, которым это может повлиять, - это то, что поток был прерван между вызовом на File.Create
и вызов Dispose
. Если это условие гонки существует, я подозреваю, что оно также существовало бы в версии using
, если бы поток был прерван в самом конце метода File.Create
, как раз перед возвратом значения...
File.WriteAllText("path", String.Empty);
или
File.CreateText("path").Close();
System.IO.File.Create(@"C:\Temp.txt");
Как указывали другие, вы должны избавиться от этого объекта или обернуть его в пустой оператор using.
using (System.IO.File.Create(@"C:\Temp.txt"));
Вы можете связать методы с возвращенным объектом, чтобы сразу закрыть файл, который вы только что открыли, в одном выражении.
File.Open("filename", FileMode.Create).Close();
Несколько распространенный прецедент для создания пустого файла - это запуск чего-то другого в другом процессе в отсутствие более сложного процесса связи. В этом случае он может помочь создать создание файла с точки зрения внешнего мира (особенно если инициируемая вещь собирается удалить файл, чтобы "потреблять" триггер).
Таким образом, это может помочь создать имя нежелательной почты (Guid.NewGuid.ToString()) в том же каталоге, что и файл, который вы хотите создать, а затем сделать File.Move от временного имени до требуемого имени. В противном случае запускаемый код, который проверяет существование файла, а затем удаляет триггер, может запускаться в условиях гонки, где файл удаляется до того, как он полностью закрыт.
Наличие временного файла в том же каталоге (и файловой системе) дает вам атомарность, которую вы можете захотеть. Это дает что-то вроде.
public void CreateEmptyFile(string path)
{
string tempFilePath = Path.Combine(Path.GetDirectoryName(path),
Guid.NewGuid.ToString());
using (File.Create(tempFilePath)) {}
File.Move(tempFilePath, path);
}
Чтобы избежать случайной перезаписи существующего файла, используйте:
using (new FileStream(filename, FileMode.CreateNew)) {}
... и обрабатывать IOException, которое произойдет, если файл уже существует.
File.Create
, который предлагается в других ответах, перезапишет содержимое, если файл уже существует. В простых случаях вы можете уменьшить это, используя File.Exists()
. Однако в сценариях, где несколько потоков и/или процессов пытаются создать файлы в одной и той же папке одновременно, требуется нечто более надежное.
Path.GetTempFileName() создаст уникальный пустой файл и вернет ему путь.
Если вы хотите контролировать путь, но получите произвольное имя файла, вы можете использовать GetRandomFileName, чтобы просто вернуть строку имени файла и использовать ее с Create
Например:
string fileName=Path.GetRandomFileName();
File.Create("custom\\path\\" + fileName);