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]);
Menggunakan saja File.Create
akan 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 Dispose
langsung:
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 Dispose
langsung daripada menggunakan using
pernyataan 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.Create
dan panggilan ke Dispose
. Jika kondisi balapan itu ada, saya menduga itu juga akan ada dalam using
versi, jika utas dibatalkan pada akhir File.Create
metode, 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 sajaDispose
- lihat github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/…using (new FileStream(filename, FileMode.CreateNew)) { }
atau
sumber
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.UTF8
mengembalikan encoder yang mengeluarkan Byte Order Mark (BOM). Anda dapat menggunakannew 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 gunakanFile.WriteAllBytes(path, new byte[] { });
saja.Seperti yang telah ditunjukkan orang lain, Anda harus membuang objek ini atau membungkusnya dengan pernyataan kosong menggunakan.
sumber
Untuk menghindari penulisan file yang ada secara tidak sengaja:
... 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 menggunakanFile.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.sumber
Anda dapat mengaitkan metode dari objek yang dikembalikan, sehingga Anda dapat segera menutup file yang baru saja Anda buka dalam satu pernyataan.
sumber
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.
sumber
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:
sumber