Создание пустого файла в С#

Какой простейший/канонический способ создания пустого файла в С#/. NET?

Самый простой способ, который я смог найти, - это:

System.IO.File.WriteAllLines(filename, new string[0]);

Ответ 1

Использование только 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, как раз перед возвратом значения...

Ответ 2

File.WriteAllText("path", String.Empty);

или

File.CreateText("path").Close();

Ответ 3

System.IO.File.Create(@"C:\Temp.txt");

Как указывали другие, вы должны избавиться от этого объекта или обернуть его в пустой оператор using.

using (System.IO.File.Create(@"C:\Temp.txt"));

Ответ 4

Вы можете связать методы с возвращенным объектом, чтобы сразу закрыть файл, который вы только что открыли, в одном выражении.

File.Open("filename", FileMode.Create).Close();

Ответ 5

Несколько распространенный прецедент для создания пустого файла - это запуск чего-то другого в другом процессе в отсутствие более сложного процесса связи. В этом случае он может помочь создать создание файла с точки зрения внешнего мира (особенно если инициируемая вещь собирается удалить файл, чтобы "потреблять" триггер).

Таким образом, это может помочь создать имя нежелательной почты (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);
}

Ответ 6

Чтобы избежать случайной перезаписи существующего файла, используйте:

using (new FileStream(filename, FileMode.CreateNew)) {}

... и обрабатывать IOException, которое произойдет, если файл уже существует.

File.Create, который предлагается в других ответах, перезапишет содержимое, если файл уже существует. В простых случаях вы можете уменьшить это, используя File.Exists(). Однако в сценариях, где несколько потоков и/или процессов пытаются создать файлы в одной и той же папке одновременно, требуется нечто более надежное.

Ответ 7

Path.GetTempFileName() создаст уникальный пустой файл и вернет ему путь.

Если вы хотите контролировать путь, но получите произвольное имя файла, вы можете использовать GetRandomFileName, чтобы просто вернуть строку имени файла и использовать ее с Create

Например:

string fileName=Path.GetRandomFileName();
File.Create("custom\\path\\" + fileName);