7 ответов:
используя
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.Open("filename", FileMode.Create).Close();
несколько распространенный вариант использования для создания пустого файла заключается в том, чтобы вызвать что-то еще, происходящее в другом процессе, при отсутствии более сложной связи с процессом. В этом случае это может помочь сделать создание файла атомарным с точки зрения внешнего мира (особенно если запускаемая вещь собирается удалить файл, чтобы "потреблять" триггер).
Так что это может помочь создать нежелательное имя (Guid.Метод newguid.ToString()) в том же каталоге, что и файл, который вы хотите создать, а затем сделать файл.Перейти от временной именем по вашему усмотрению. В противном случае срабатывает код, который проверяет наличие файла, а затем удаляет триггер может работать в условиях гонки, где файл удаляется до его полного закрытия.
наличие временного файла в том же каталоге (и файловой системе) дает вам атомарность, которую вы можете захотеть. Это дает что-то вроде.
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(). Однако что-то более надежное необходимо в сценариях, где несколько потоков и / или процессов пытаются создать файлы в одной папке одновременно.
путь.GetTempFileName () создаст пустой файл с уникальным именем и вернет к нему путь.
Если вы хотите управлять путем, но получить случайное имя файла, вы можете использовать GetRandomFileName, чтобы просто вернуть строку имени файла и использовать ее с Create
например:
string fileName=Path.GetRandomFileName(); File.Create("custom\path\" + fileName);
Comments