Apa cara paling sederhana / kanonik untuk membuat file kosong di C # /. NET?
Cara paling sederhana yang bisa saya temukan sejauh ini adalah:
System.IO.File.WriteAllLines(filename, new string[0]);
Apa cara paling sederhana / kanonik untuk membuat file kosong di C # /. NET?
Cara paling sederhana yang bisa saya temukan sejauh ini adalah:
System.IO.File.WriteAllLines(filename, new string[0]);
Jawaban:
Menggunakan saja File.Createakan membiarkan file terbuka, yang mungkin bukan yang Anda inginkan.
Anda bisa menggunakan:
using (File.Create(filename)) ;
Itu terlihat sedikit aneh, ingat. Anda bisa menggunakan kawat gigi sebagai gantinya:
using (File.Create(filename)) {}
Atau telepon Disposelangsung:
File.Create(filename).Dispose();
Either way, jika Anda akan menggunakan ini di lebih dari satu tempat Anda mungkin harus mempertimbangkan membungkusnya dengan metode pembantu, misalnya
public static void CreateEmptyFile(string filename)
{
File.Create(filename).Dispose();
}
Perhatikan bahwa menelepon Disposelangsung daripada menggunakan usingpernyataan tidak benar-benar membuat banyak perbedaan di sini sejauh yang saya tahu - satu-satunya cara itu bisa membuat perbedaan adalah jika utas dibatalkan antara panggilan ke File.Createdan panggilan ke Dispose. Jika kondisi balapan itu ada, saya menduga itu juga akan ada dalam usingversi, jika utas dibatalkan pada akhir File.Createmetode, tepat sebelum nilainya dikembalikan ...
using (File.Create(filename)) ;, tetapi saya suka kesederhanaanFile.Create(filename).Dispose();
File.Create(filename).Dispose();bukan.
Close()akan merilis sumber daya juga. Close()panggil saja Dispose- lihat github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/…
using (new FileStream(filename, FileMode.CreateNew)) { }
File.WriteAllText("path", String.Empty);
atau
File.CreateText("path").Close();
File.WriteAllText(string, string)menggunakan "pengkodean UTF-8 tanpa Byte-Order Mark (BOM)" . Jika Anda masih melihatnya, itu akan menjadi bug di WriteAllText atau dokumentasinya yang layak dilaporkan.
Encoding.UTF8mengembalikan encoder yang mengeluarkan Byte Order Mark (BOM). Anda dapat menggunakan new UTF8Encoding(false)untuk mendapatkan enkoder UTF8 yang tidak menghasilkan BOM.
WriteAllText benar-benar berperilaku berbeda di versi .NET sebelumnya. Namun, untuk lebih yakin, lewati saja bagian penyandian dan gunakan File.WriteAllBytes(path, new byte[] { });saja.
System.IO.File.Create(@"C:\Temp.txt");
Seperti yang telah ditunjukkan orang lain, Anda harus membuang objek ini atau membungkusnya dengan pernyataan kosong menggunakan.
using (System.IO.File.Create(@"C:\Temp.txt"));
Untuk menghindari penulisan file yang ada secara tidak sengaja:
using (new FileStream(filename, FileMode.CreateNew)) {}
... dan menangani IOException yang akan terjadi jika file tersebut sudah ada.
File.Create, yang disarankan dalam jawaban lain, akan menimpa konten file jika sudah ada. Dalam kasus sederhana, Anda dapat mengurangi ini menggunakan File.Exists(). Namun sesuatu yang lebih kuat diperlukan dalam skenario di mana banyak utas dan / atau proses berusaha untuk membuat file di folder yang sama secara bersamaan.
Kasus penggunaan yang agak umum untuk membuat file kosong adalah untuk memicu sesuatu yang lain terjadi dalam proses yang berbeda tanpa adanya proses komunikasi yang lebih canggih. Dalam hal ini, dapat membantu membuat file menjadi atom dari sudut pandang dunia luar (terutama jika hal yang dipicu akan menghapus file untuk "mengonsumsi" pelatuk).
Jadi dapat membantu untuk membuat nama sampah (Guid.NewGuid.ToString ()) di direktori yang sama dengan file yang ingin Anda buat, dan kemudian lakukan File. Pindahkan dari nama sementara ke nama yang Anda inginkan. Jika tidak, kode yang dipicu yang memeriksa keberadaan file dan kemudian menghapus pelatuk dapat mengalami kondisi balapan di mana file dihapus sebelum sepenuhnya ditutup.
Memiliki file temp di direktori yang sama (dan sistem file) memberi Anda atomicity yang Anda inginkan. Ini memberi sesuatu seperti.
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 () akan membuat file kosong bernama uniquly dan mengembalikan path ke sana.
Jika Anda ingin mengontrol jalur tetapi mendapatkan nama file acak, Anda dapat menggunakan GetRandomFileName untuk mengembalikan string nama file dan menggunakannya dengan Buat
Sebagai contoh:
string fileName=Path.GetRandomFileName();
File.Create("custom\\path\\" + fileName);