Buat file .txt jika tidak ada, dan jika itu menambahkan baris baru

161

Saya ingin membuat file .txt dan menulisnya, dan jika file tersebut sudah ada, saya hanya ingin menambahkan beberapa baris lagi:

string path = @"E:\AppServ\Example.txt";
if (!File.Exists(path))
{
    File.Create(path);
    TextWriter tw = new StreamWriter(path);
    tw.WriteLine("The very first line!");
    tw.Close();
}
else if (File.Exists(path))
{
    TextWriter tw = new StreamWriter(path);
    tw.WriteLine("The next line!");
    tw.Close(); 
}

Tapi baris pertama sepertinya selalu ditimpa ... bagaimana saya bisa menghindari penulisan pada baris yang sama (saya menggunakan ini dalam satu lingkaran)?

Saya tahu ini hal yang sangat sederhana, tetapi saya tidak pernah menggunakan WriteLinemetode ini sebelumnya. Saya benar-benar baru di C #.

Berker Yüceer
sumber
3
Berhati-hatilah karena hampir semua jawaban di sini salah dan tunduk pada kondisi lomba . Ingat: polanya if (file exists) { open file }hampir selalu salah di semua bahasa pemrograman! Untuk .NET solusinya adalah menggunakan File.Open(path, FileMode.Append, FileAccess.ReadWrite)flag yang sesuai.
ComFreek
"Nilai FileMode yang menentukan apakah file dibuat jika tidak ada, dan menentukan apakah konten file yang ada dipertahankan atau ditimpa." jadi hal yang sama dilakukan oleh .net daripada pendekatan manual di sini. Jadi tidak salah di sini, itu adalah proses yang sama dilakukan secara manual. Anda mungkin mengatakan tidak efisien tetapi mengatakan yang salah tidak masuk hitungan.
Berker Yüceer
Perbedaannya adalah: File.Opendelegasi internal ke fungsi WinAPI (lihat komentar berikutnya) semoga mencegah kondisi balapan. Sebagian besar solusi di sini tidak melakukan ini dan cukup jelas tunduk pada kondisi lomba.
ComFreek
1
Namun pemeriksaan keberadaan ditentukan oleh FileMode.Append di sini .. dan mengarahkan ke pemeriksaan keberadaan kemudian membuat file dengan CreateFileA. Masih salah mengatakan agak ekstrem, tapi bisa dibilang tidak efisien. Kami juga tidak boleh lupa bahwa pemeriksaan keberadaan mungkin tidak hanya digunakan untuk akses tulis / baca juga dapat digunakan oleh hal-hal lain sehingga untuk pemula baru topik ini berguna untuk memahami cara kerjanya. Namun jika Anda dapat menambahkan jawaban termasuk semua definisi yang Anda tulis di sini dan alasan mengapa lebih baik yang akan banyak membantu sebagai jawaban dan mungkin akan dipilih sebagai benar.
Berker Yüceer
1
@ComFreek Saya sangat setuju bahwa Anda harus menulis jawaban lengkap untuk menjelaskannya dengan jelas. Komentar bukan untuk menjawab, dan saya sangat ingin tahu tentang kondisi balapan ini dan bagaimana Anda mengusulkan untuk menyelesaikannya.
Matthieu Foltzer

Jawaban:

167

Gunakan konstruktor yang benar :

else if (File.Exists(path))
{
    using(var tw = new StreamWriter(path, true))
    {
        tw.WriteLine("The next line!");
    }
}
Daniel Hilgarth
sumber
11
Jawaban pertama, Jawaban paling sederhana, Jawaban paling berguna untuk saya lol. Ketika saya melihatnya saya seperti: Hah? hanya menambahkan ", benar" sudah cukup? Kenapa saya tidak melihat itu sebelumnya? Sial ... Aku merasa sangat berterima kasih. Saya sangat menghargai jawaban yang agak bagus ini.
Berker Yüceer
7
petunjuk: Jika file tidak ada, konstruktor ini membuat file baru.
Abou-Emish
1
bungkus saya menggunakan (lihat jawaban di bawah).
David Thielen
1
Tutup adalah mubazir, jika Anda telah menggunakan
Michael Freidgeim
2
-1 Ini tunduk pada kondisi lomba dan dapat menghasilkan perilaku yang salah! Mungkin lebih suka menggunakan File.Open(path, FileMode.Append, FileAccess.ReadWrite)dan memeriksa ukuran file melalui aliran yang dikembalikan.
ComFreek
57
string path = @"E:\AppServ\Example.txt";
File.AppendAllLines(path, new [] { "The very first line!" });

Lihat juga File.AppendAllText (). AppendAllLines akan menambahkan baris baru ke setiap baris tanpa harus meletakkannya di sana sendiri.

Kedua metode akan membuat file jika tidak ada sehingga Anda tidak perlu melakukannya.

drch
sumber
3
Saya pikir ini lebih tepat untuk apa yang diminta pengguna. Sepertinya ada 2 masalah. 1 adalah teks ditimpa - ini karena WriteLine menulis file secara berlebihan. Dalam hal ini, File.AppendAllText lebih tepat. dan 2) - pertanyaan tentang bagaimana saya bisa membuat file saya dan tahu saya akan menambahkannya. Baik untuk mengetahuinya File.AppendAllText membuat file, itu pertanyaan saya. StreamWriter tidak selalu sesuai, tergantung pada aplikasi apa yang digunakan. Yang manapun ini membantu saya. +1
Devin C
42
string path=@"E:\AppServ\Example.txt";

if(!File.Exists(path))
{
   File.Create(path).Dispose();

   using( TextWriter tw = new StreamWriter(path))
   {
      tw.WriteLine("The very first line!");
   }

}    
else if (File.Exists(path))
{
   using(TextWriter tw = new StreamWriter(path))
   {
      tw.WriteLine("The next line!");
   }
}
Aek
sumber
Saya memiliki masalah yang sama juga, dan menemukan poster ini tetapi solusi di sini tidak menyelesaikan masalah saya. Jadi saya menggunakan beberapa solusi dan hanya menambahkan Buang (). Tujuan saya tidak melibatkan copy-paste.
Aek
1
Saya tidak menyarankan itu; Saya mengatakan bahwa tanpa memasukkan itu dalam jawaban Anda, poster asli tidak akan tahu mengapa Anda membuat perubahan yang Anda buat atau apa yang seharusnya mereka capai. Selalu sertakan semua informasi yang relevan saat Anda memposting, sehingga orang akan tahu semua yang Anda lakukan. :)
DiMono
1
Ini berfungsi karena tidak memberikan kesalahan yang mengatakan Anda tidak bisa menulis ke file yang baru dibuat karena sedang digunakan oleh proses lain. .Dispose () adalah kuncinya. Terima kasih banyak!
GenXisT
Ini sama sekali tidak menjawab pertanyaan, yaitu tentang menjaga konten yang ada.
Ben Voigt
Tidak ada gunanya menelepon Close()dari suatu usingpernyataan, karena semua sumber daya akan ditutup sebelum dibuang secara otomatis.
Sheridan
21

Anda sebenarnya tidak perlu memeriksa apakah file itu ada, karena StreamWriter akan melakukannya untuk Anda. Jika Anda membukanya dalam mode-append, file akan dibuat jika tidak ada, maka Anda akan selalu menambahkan dan tidak pernah menulis berlebihan. Jadi cek awal Anda berlebihan.

TextWriter tw = new StreamWriter(path, true);
tw.WriteLine("The next line!");
tw.Close(); 
John Boling
sumber
1
Saya mencoba untuk mengerjakan logika dari jawaban yang diterima, saya tahu saya telah melakukan ini dalam satu baris sebelumnya tetapi tidak dapat mengingat sintaks yang tepat. Terima kasih.
Morvael
14

File.AppendAllText menambahkan string ke file. Ini juga membuat file teks jika file tersebut tidak ada. Jika Anda tidak perlu membaca konten, itu sangat efisien. Case use adalah logging.

File.AppendAllText("C:\\log.txt", "hello world\n");
R.Cha
sumber
Ini hanya yang saya butuhkan, tetapi bagaimana saya bisa membuat konten baru dimulai pada baris baru? Saya menggunakan file CSV.
NiallUK
Saya kira tidak ada solusi sederhana. Saya sarankan Anda untuk memeriksa posting ini. stackoverflow.com/questions/1343044/…
R.Cha
6

Anda hanya ingin membuka file dalam mode "append".

http://msdn.microsoft.com/en-us/library/3zc0w663.aspx

Ed Manet
sumber
ya ini berguna juga tetapi saya sedang mencari solusi yang cepat dan sederhana dan terima kasih kepada @Daniel Hilgarth dia memberikan solusi yang agak. jadi +1.
Berker Yüceer
3

Ketika Anda memulai StreamWriter, itu menimpa teks yang ada di sana sebelumnya. Anda dapat menggunakan properti append seperti:

TextWriter t = new StreamWriter(path, true);
Matan Shahar
sumber
3
 else if (File.Exists(path)) 
{ 
  using (StreamWriter w = File.AppendText(path))
        {
            w.WriteLine("The next line!"); 
            w.Close();
        }
 } 
Memukul
sumber
1
Jika Anda memiliki blok `using ', w.Close redundant. Buang pada akhir menggunakan blok melakukan hal yang sama.
Michael Freidgeim
-1 Ini tunduk pada kondisi lomba dan dapat menghasilkan perilaku yang salah! Mungkin lebih suka menggunakan File.Open(path, FileMode.Append, FileAccess.ReadWrite)dan memeriksa ukuran file melalui aliran yang dikembalikan.
ComFreek
2

Coba ini.

string path = @"E:\AppServ\Example.txt";
if (!File.Exists(path))
{
    using (var txtFile = File.AppendText(path))
    {
        txtFile.WriteLine("The very first line!");
    }
}
else if (File.Exists(path))
{     
    using (var txtFile = File.AppendText(path))
    {
        txtFile.WriteLine("The next line!");
    }
}
Asiri Jayaweera
sumber
Redudant File.AppendText(path), dan dengan itu tidak perlu memeriksa File.Exists(path). Dan If (not A) Else If (A)adalah If / Else yang aneh. Pada dasarnya tidak ada hal yang baik dalam pertanyaan ini, tidak ada kode penjelasan yang merupakan versi redudan dari jawaban lain.
xdtTransformasi
-1 Ini tunduk pada kondisi lomba dan dapat menghasilkan perilaku yang salah! Mungkin lebih suka menggunakan File.Open(path, FileMode.Append, FileAccess.ReadWrite)dan memeriksa ukuran file melalui aliran yang dikembalikan.
ComFreek
2

Anda cukup menggunakan File.AppendAllText () Metode ini akan menyelesaikan masalah Anda. Metode ini akan menangani Pembuatan File jika tidak tersedia, membuka dan menutup file.

var outputPath = @"E:\Example.txt";
var data = "Example Data";
File.AppendAllText(outputPath, data);
Vijay Shaaruck
sumber
1

Dari dokumentasi microsoft, Anda dapat membuat file jika tidak ada dan menambahkannya dalam satu panggilan File.AppendAllText Method (String, String)

.NET Framework (versi saat ini) Versi Lainnya

Buka file, tambahkan string yang ditentukan ke file, dan kemudian tutup file. Jika file tidak ada, metode ini membuat file, menulis string yang ditentukan ke file, lalu menutup file. Namespace: System.IO Assembly: mscorlib (in mscorlib.dll)

Sintaksis C # C ++ F # VB public static void AppendAllText (jalur string, isi string) Tipe jalur parameter: System.String File untuk menambahkan string yang ditentukan. Tipe konten: System.String String untuk menambahkan ke file.

AppendAllText

David Fawzy
sumber
1
using(var tw = new StreamWriter(path, File.Exists(path)))
{
    tw.WriteLine(message);
}
Andreas Gusakov
sumber
Secara umum, jawaban akan jauh lebih membantu jika mereka menyertakan penjelasan tentang apa yang dimaksudkan untuk dilakukan oleh kode, dan mengapa itu memecahkan masalah tanpa memperkenalkan orang lain.
Tim Diekmann