Membuat file kosong di C #

186

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]);
Paul Hollingsworth
sumber

Jawaban:

384

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 ...

Jon Skeet
sumber
8
Lucu. Saya baru saja menulis kode yang sama sekitar 5 menit yang lalu. Saya melakukan File.Create (nama file). Tutup ();
Perbedaan yang
2
Kode saya digunakan using (File.Create(filename)) ;, tetapi saya suka kesederhanaanFile.Create(filename).Dispose();
Vadim
@ BrianGenisio: Saya baru saja melakukan kode yang sama sekitar 5 menit yang lalu juga! Saya hanya googled untuk melihat bagaimana programmer lain melakukannya. Sekarang saya menggunakan File.Create(filename).Dispose();bukan.
Jack
1
@ user3791372: Close()akan merilis sumber daya juga. Close()panggil saja Dispose- lihat github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/…
Jon Skeet
2
Mungkin tidak jelas bahwa jika file sudah ada, dan bukan hanya baca, konten file ditimpa. Untuk menghindari ini, gunakanusing (new FileStream(filename, FileMode.CreateNew)) { }
Phil Haselden
34
File.WriteAllText("path", String.Empty);

atau

File.CreateText("path").Close();
knocte
sumber
2
Menggunakan yang pertama, panjang file adalah 3 byte: kode pengkodean. Menggunakan file kedua adalah 0 byte (benar-benar kosong).
Fil
1
@Fil: Apakah Anda yakin? Dokumentasi mengatakan bahwa 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.
Heinzi
Saya ingat saya sudah mencoba. Mungkin itu adalah bug lama dari versi .Net sebelumnya? File tidak kosong jika saya menetapkan secara eksplisit untuk menggunakan pengkodean UTF8 (atau unicode atau yang lainnya): <File.WriteAllText ("c: \ del.txt", String.Empty, System.Text.Encoding.UTF8);>
Fil
1
@Fil, Encoding.UTF8mengembalikan encoder yang mengeluarkan Byte Order Mark (BOM). Anda dapat menggunakan new UTF8Encoding(false)untuk mendapatkan enkoder UTF8 yang tidak menghasilkan BOM.
Daniel Crabtree
1
Tidak tahu jika 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.
Jürgen Steinblock
20
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"));
Eoin Campbell
sumber
4
tidak akan lebih baik membuang objek? misal: using (System.IO.File.Create (filepath)) {}
kentaromiura
@kentaromiura: Pikiranku persis, maka jawabanku :)
Jon Skeet
5

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.

Phil Haselden
sumber
4

Anda dapat mengaitkan metode dari objek yang dikembalikan, sehingga Anda dapat segera menutup file yang baru saja Anda buka dalam satu pernyataan.

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

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);
}
agieNick02
sumber
0

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);
Crippledsmurf
sumber
IMHO GetTempFileName () benar-benar salah nama.
kay.herzam
Mengapa jawaban ini tidak membantu?
Crippledsmurf
5
Ini tidak membantu karena dua alasan: 1. Pertanyaan tidak menanyakan apa pun tentang menghasilkan nama file acak, jadi itu gangguan. 2. File tidak ditutup, yang berarti bahwa jika Anda kemudian mencoba membuka penulis file lain, atau memindahkan file, itu akan gagal.
Sungai Satya
Saya mengambil poin Anda tetapi: 1. Semua file perlu nama. Itu sederhana. cara mudah untuk mendapatkan satu yang tidak mungkin berbenturan dengan apa pun 2. Pertanyaan yang diajukan tentang membuat file, yang mana kode yang dipermasalahkan, minimal, pengelolaan file setelahnya tidak sepenuhnya merupakan bagian dari kreasi, jadi saya menghilangkannya untuk demi kesederhanaan dan menjaga jawaban tetap fokus pada pertanyaan
Crippledsmurf