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


187

Какой самый простой / канонический способ создать пустой файл в C # /. NET?

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

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

Ответы:


385

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


8
Веселая. Я просто написал тот же код около 5 минут назад. Я сделал File.Create (имя файла) .Close (); Та же
разница

2
Мой код использовал using (File.Create(filename)) ;, но я люблю простотуFile.Create(filename).Dispose();
Вадим

@BrianGenisio: я только что сделал тот же код около 5 минут назад! Я просто погуглил, чтобы увидеть, как это сделали другие программисты. Теперь я использую File.Create(filename).Dispose();вместо.
Джек

1
@ user3791372: Close()также освободит ресурсы. Close()просто звонит Dispose- см. github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/…
Джон Скит,

2
Может быть не очевидно, что если файл уже существует и не предназначен только для чтения, содержимое файла перезаписывается. Чтобы избежать этого, используйтеusing (new FileStream(filename, FileMode.CreateNew)) { }
Phil Haselden

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

или

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

2
Используя первый, файл имеет длину 3 байта: код кодировки. При использовании второго файл имеет размер 0 байт (действительно пустой).
Fil

1
@Fil: Ты уверен? В документации говорится, что File.WriteAllText(string, string)используется «кодировка UTF-8 без метки порядка байтов (BOM)» . Если вы все еще видите его, это будет ошибкой в ​​WriteAllText или его документации, о которой стоит сообщить.
Хайнци

Я помню, что попробовал. Может быть, это была старая ошибка предыдущей версии .Net? Файл не пуст, если я явно укажу использовать кодировку UTF8 (или Unicode или что-то еще): <File.WriteAllText ("c: \ del.txt", String.Empty, System.Text.Encoding.UTF8);>
Фил

1
@Fil, Encoding.UTF8возвращает кодировщик, который выводит метку порядка байтов (BOM). Вы можете использовать, new UTF8Encoding(false)чтобы получить кодировщик UTF8, который не выводит спецификацию.
Даниэль Крэбтри

1
Не знаю, WriteAllTextдействительно ли ведет себя иначе в предыдущей версии .NET. Однако, чтобы быть уверенным, просто пропустите часть кодирования и используйте File.WriteAllBytes(path, new byte[] { });вместо этого.
Юрген Стейнблок

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

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

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

4
не лучше ли будет утилизировать объект? Например: using (System.IO.File.Create (filepath)) {}
kentaromiura

@kentaromiura: Мои мысли точно, отсюда мой ответ :)
Джон Скит

5

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

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

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

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


4

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

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

2

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

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

0

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

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

Например:

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

IMHO GetTempFileName () полностью неверно назван.
kay.herzam

Почему именно этот ответ не помогает?
Crippledsmurf

5
Это бесполезно по двум причинам: 1. Вопрос не задает ничего о генерации случайного имени файла, так что это отвлекает. 2. Файл не закрывается, а это означает, что если вы позже попытаетесь открыть другой файл или переместить файл, произойдет сбой.
Река Сатья

Я беру ваши очки, но: 1. Все файлы нуждаются в имени. Это было просто. удобный способ получить тот, который вряд ли столкнется с чем-либо 2. Заданный вопрос о создании файлов, который, как показывает рассматриваемый код, минимально, управление файлом после этого не является строго частью создания, поэтому я опустил его для ради простоты и сосредоточенности ответа на вопросе
Crippledsmurf
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.