Який найпростіший / канонічний спосіб створити порожній файл у C # /. NET?
Найпростіший спосіб, який я міг знайти зараз, це:
System.IO.File.WriteAllLines(filename, new string[0]);
Який найпростіший / канонічний спосіб створити порожній файл у C # /. NET?
Найпростіший спосіб, який я міг знайти зараз, це:
System.IO.File.WriteAllLines(filename, new string[0]);
Відповіді:
Використання просто 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, який не виводить BOM.
WriteAllText
дійсно поводиться по-іншому в попередній версії .NET. Однак, щоб бути впевненим, просто пропустіть частину кодування та скористайтеся File.WriteAllBytes(path, new byte[] { });
натомість.
System.IO.File.Create(@"C:\Temp.txt");
Як зазначали інші, вам слід утилізувати цей об’єкт або загорнути його в порожнє за допомогою оператора.
using (System.IO.File.Create(@"C:\Temp.txt"));
Щоб уникнути випадкового перезапису наявного файлу, використовуйте:
using (new FileStream(filename, FileMode.CreateNew)) {}
... і обробляти IOException, який відбудеться, якщо файл вже існує.
File.Create
, що пропонується в інших відповідях, замінить вміст, якщо файл вже існує. У простих випадках ви можете пом'якшити це за допомогою File.Exists()
. Однак щось більш надійне в сценаріях, коли кілька потоків та / або процесів намагаються одночасно створювати файли в одній папці.
Дещо поширений випадок використання для створення порожнього файлу - це викликати щось інше, що відбувається в іншому процесі за відсутності більш досконалої в процесі зв'язку. У цьому випадку може допомогти створення файлу атомним з точки зору зовнішнього світу (особливо, якщо спрацьовує справа - видалити файл, щоб "спожити" тригер).
Таким чином, це може допомогти створити ім'я небажаної пошти (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);
}
Path.GetTempFileName () створить неповторно названий порожній файл і поверне шлях до нього.
Якщо ви хочете керувати шляхом, але отримуєте випадкове ім'я файлу, ви можете використовувати GetRandomFileName, щоб просто повернути рядок імені файлу та використовувати його зі створенням
Наприклад:
string fileName=Path.GetRandomFileName();
File.Create("custom\\path\\" + fileName);