Створення порожнього файлу в C #


186

Який найпростіший / канонічний спосіб створити порожній файл у C # /. NET?

Найпростіший спосіб, який я міг знайти зараз, це:

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

Відповіді:


384

Використання просто 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/…
Джон Скіт

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

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

або

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

2
Використовуючи перший, файл триває 3 байти: код кодування. За допомогою другого файл має 0 байт (дійсно порожній).
Філ

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, який не виводить BOM.
Даніель Кребтрі

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

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

Як зазначали інші, вам слід утилізувати цей об’єкт або загорнути його в порожнє за допомогою оператора.

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

4
не буде краще розпоряджатися об’єктом? наприклад: використовуючи (System.IO.File.Create (filepath)) {}
kentaromiura

@kentaromiura: Мої думки точно, звідси і моя відповідь :)
Джон Скіт

4

Ви можете зв'язати методи з поверненим об'єктом, щоб ви могли негайно закрити файл, який ви щойно відкрили, одним оператором.

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

4

Щоб уникнути випадкового перезапису наявного файлу, використовуйте:

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

... і обробляти IOException, який відбудеться, якщо файл вже існує.

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


2

Дещо поширений випадок використання для створення порожнього файлу - це викликати щось інше, що відбувається в іншому процесі за відсутності більш досконалої в процесі зв'язку. У цьому випадку може допомогти створення файлу атомним з точки зору зовнішнього світу (особливо, якщо спрацьовує справа - видалити файл, щоб "спожити" тригер).

Таким чином, це може допомогти створити ім'я небажаної пошти (Guid.NewGuid.ToString ()) в тому ж каталозі, що і файл, який ви хочете створити, а потім зробіть файл FileMove від тимчасового імені до потрібного імені. В іншому випадку запускається код, який перевіряє наявність файлу, а потім видаляє тригер, може зіткнутися з умовами перегонів, де файл видаляється до його повного закриття.

Наявність файлу temp у тому самому каталозі (і файловій системі) надає вам атомність, яку ви можете захотіти. Це дає щось подібне.

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, щоб просто повернути рядок імені файлу та використовувати його зі створенням

Наприклад:

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.