Какой самый простой / канонический способ создать пустой файл в C # /. NET?
Самый простой способ, который я смог найти, это:
System.IO.File.WriteAllLines(filename, new string[0]);
Какой самый простой / канонический способ создать пустой файл в C # /. NET?
Самый простой способ, который я смог найти, это:
System.IO.File.WriteAllLines(filename, new string[0]);
Ответы:
Использование just 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метода, непосредственно перед возвращением значения ...
using (File.Create(filename)) ;, но я люблю простотуFile.Create(filename).Dispose();
File.Create(filename).Dispose();вместо.
Close()также освободит ресурсы. Close()просто звонит Dispose- см. github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/…
using (new FileStream(filename, FileMode.CreateNew)) { }
File.WriteAllText("path", String.Empty);
или
File.CreateText("path").Close();
File.WriteAllText(string, string)используется «кодировка UTF-8 без метки порядка байтов (BOM)» . Если вы все еще видите его, это будет ошибкой в WriteAllText или его документации, о которой стоит сообщить.
Encoding.UTF8возвращает кодировщик, который выводит метку порядка байтов (BOM). Вы можете использовать, new UTF8Encoding(false)чтобы получить кодировщик UTF8, который не выводит спецификацию.
WriteAllTextдействительно ли ведет себя иначе в предыдущей версии .NET. Однако, чтобы быть уверенным, просто пропустите часть кодирования и используйте File.WriteAllBytes(path, new byte[] { });вместо этого.
System.IO.File.Create(@"C:\Temp.txt");
Как уже отмечали другие, вы должны избавиться от этого объекта или обернуть его в пустой оператор using.
using (System.IO.File.Create(@"C:\Temp.txt"));
Чтобы избежать случайной перезаписи существующего файла, используйте:
using (new FileStream(filename, FileMode.CreateNew)) {}
... и обработать IOException, которое произойдет, если файл уже существует.
File.Create, что предлагается в других ответах, перезапишет содержимое файла, если он уже существует. В простых случаях вы могли бы смягчить это, используя File.Exists(). Однако в сценариях, где несколько потоков и / или процессов пытаются одновременно создавать файлы в одной и той же папке, требуется нечто более надежное.
Несколько распространенный вариант использования для создания пустого файла состоит в том, чтобы инициировать что-то еще, происходящее в другом процессе, в отсутствие более сложной коммуникации процесса. В этом случае может быть полезно, чтобы создание файла было атомарным с точки зрения внешнего мира (особенно, если вызываемая вещь собирается удалить файл, чтобы «использовать» триггер).
Таким образом, это может помочь создать нежелательное имя (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);
}
Path.GetTempFileName () создаст пустой файл с уникальным именем и вернет путь к нему.
Если вы хотите контролировать путь, но получить случайное имя файла, вы можете использовать GetRandomFileName, чтобы просто вернуть строку имени файла и использовать ее с Create
Например:
string fileName=Path.GetRandomFileName();
File.Create("custom\\path\\" + fileName);