Mevcut değilse ve yeni bir satır ekliyorsa bir .txt dosyası oluşturun


161

Bir .txt dosyası oluşturmak ve ona yazmak istiyorum ve dosya zaten varsa, sadece birkaç satır daha eklemek istiyorum:

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(); 
}

Ama ilk satır her zaman üzerine yazılıyor gibi ... aynı satırda yazmaktan nasıl kaçınabilirim (bunu bir döngüde kullanıyorum)?

Bunun oldukça basit bir şey olduğunu biliyorum, ama daha WriteLineönce hiç bu yöntemi kullanmadım. C # için tamamen yeniyim.


3
Sakının burada hemen hemen tüm cevaplar yanlış ve konu yarış koşulları . Unutmayın: desen if (file exists) { open file }tüm programlama dillerinde neredeyse her zaman yanlıştır! .NET için çözüm File.Open(path, FileMode.Append, FileAccess.ReadWrite)uygun bayraklarla kullanmaktır .
ComFreek

"Bir dosya yoksa dosyanın oluşturulup oluşturulmayacağını belirten ve varolan dosyaların içeriğinin korunup korunmayacağını belirleyen bir FileMode değeri." aynı şey burada manuel yaklaşım yerine .net tarafından yapılır. Yani burada yanlış değil, aynı işlem elle yapılır. Verimsiz diyebilirsiniz ama yanlış demek önemli değildir.
Berker Yüceer

Fark: File.Opendahili olarak WinAPI işlevine delege olur (bir sonraki yoruma bakın) umarım yarış durumunu önler. Buradaki çoğu çözüm bunu yapmaz ve açıkça yarış koşullarına tabidir.
ComFreek

1
Ancak varlık denetimi FileMode tarafından belirlenir. Buraya ekleyin .. ve bir varlık denetimine yönlendirir ve ardından CreateFileA ile dosya oluşturur. Hala biraz aşırı yanlış söylüyorum, ama verimsiz diyebilirsiniz. Ayrıca, varoluş kontrolünün yalnızca yazma / okuma erişimi için kullanılamayabileceğini unutmamalıyız, bu nedenle yeni başlayanlar için bu konu nasıl çalıştığını anlamak için yararlıdır. Bununla birlikte, burada yazdığınız tüm tanımları ve daha iyi olmasının nedeninin bir cevap olarak çok yardımcı olacağı ve muhtemelen doğru olarak seçileceği bir cevap ekleyebilirsiniz.
Berker Yüceer

1
@ComFreek Açıkça açıklamak için tam bir cevap yazmanız gerektiğini kesinlikle kabul ediyorum. Yorumlar yanıtlamak için değildir ve bu yarış koşullarını ve bunu nasıl çözmeyi önerdiğinizi içtenlikle merak ediyorum.
Matthieu Foltzer

Yanıtlar:


167

Doğru yapıcıyı kullanın :

else if (File.Exists(path))
{
    using(var tw = new StreamWriter(path, true))
    {
        tw.WriteLine("The next line!");
    }
}

11
İlk cevap, En basit cevap, Benim için en yararlı cevap lol. Ben baktığımda şöyle oldu: Huh? sadece ", true" eklemek yeterlidir? Bunu daha önce nasıl görmeyeceğim? Kahretsin ... Tamamen aptalca bir şey gibi hissettim. Bu tür iyi cevapları gerçekten çok takdir ediyorum.
Berker Yüceer

7
ipucu: Dosya yoksa, bu yapıcı yeni bir dosya oluşturur.
Abou-Emish

1
i'yi kullanarak sarın (aşağıdaki cevaba bakın).
David Thielen

1
Kapat kullanıyorsanız gereksizdir
Michael Freidgeim

2
-1 Bu yarış koşullarına tabidir ve yanlış davranışlara neden olabilir! Belki de File.Open(path, FileMode.Append, FileAccess.ReadWrite)döndürülen akış yoluyla dosya boyutunu kullanın ve kontrol edin.
ComFreek

57
string path = @"E:\AppServ\Example.txt";
File.AppendAllLines(path, new [] { "The very first line!" });

Ayrıca bkz. File.AppendAllText (). AppendAllLines her satıra kendiniz koymak zorunda kalmadan bir satırsonu ekleyecektir.

Her iki yöntem de yoksa, dosyayı oluşturmanıza gerek kalmaz.


3
Bu kullanıcının sorduğu şey için daha uygun olduğunu düşünüyorum. 2 sorun var gibi görünüyor. 1 metnin üzerine yazılır - bunun nedeni WriteLine dosyasının üzerine yazmasıdır. Bu durumda, File.AppendAllText daha uygundur. ve 2) - dosyamı nasıl oluşturabilirim ve eklediğimi nasıl bilebilirim sorusu. Bunu bilmek güzel File.AppendAllText dosyayı oluşturur, bu benim sorumdu. StreamWriter her zaman uygun değildir, bu uygulamanın ne için kullanıldığına bağlıdır. Her iki durumda da bu bana yardımcı oldu. +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!");
   }
}

Ben de aynı bir sorun var ve bu posteri bulmak ama buradaki çözümler sorunumu çözmez. Bu yüzden bazı çözüm parçaları kullanıyorum ve sadece Dispose () ekliyorum. Amacım kopyala yapıştırma içermiyor.
Aek

1
Öyle olduğunu söylemiyorum; Bunu, cevabınıza dahil etmeden orijinal posterin neden yaptığınız değişiklikleri yaptığınızı veya neyi başarmaları gerektiğini bilemeyeceğini söylüyorum. İnsanların ne yaptığınızı bilmeleri için, yayınlarken her zaman ilgili tüm bilgileri ekleyin. :)
DiMono

1
Bu, yeni oluşturulan dosyaya başka bir işlem tarafından kullanıldığından yazamayacağınızı söyleyen bir hata vermediği için çalışır. .Dispose () anahtarıdır. Çok teşekkür ederim!
GenXisT

Bu hiçbir şekilde mevcut içeriklerin korunmasıyla ilgili soruyu ele almaz.
Ben Voigt

Close()Bir usingifadeden çağrı yapmanın bir anlamı yoktur , çünkü tüm kaynaklar otomatik olarak atılmadan önce kapatılacaktır.
Sheridan

21

StreamWriter bunu sizin için yapacağından dosyanın var olup olmadığını gerçekten kontrol etmeniz gerekmez. Ekleme modunda açarsanız, dosya yoksa dosya oluşturulur, her zaman eklenir ve asla üzerine yazılmazsınız. Böylece ilk kontrolünüz gereksizdir.

TextWriter tw = new StreamWriter(path, true);
tw.WriteLine("The next line!");
tw.Close(); 

1
Kabul edilen cevabın mantığını çözmeye çalışıyordum, bunu daha önce tek bir satırda yaptığımı biliyordum ama tam sözdizimini hatırlayamıyordum. Teşekkür ederim.
Morvael

14

File.AppendAllText bir dosyaya dize ekler. Dosya yoksa bir metin dosyası da oluşturur. İçeriği okumanız gerekmiyorsa çok etkilidir. Kullanım durumu günlüğe kaydediliyor.

File.AppendAllText("C:\\log.txt", "hello world\n");

Bu sadece ihtiyacım olan şeydi, ancak yeni içeriği yeni bir satırda nasıl başlatabilirim? CSV dosyaları kullanıyorum.
NiallUK

Sanırım basit bir çözüm yok. Bu yazıyı kontrol etmenizi öneririm. stackoverflow.com/questions/1343044/…
R.Cha


3

StreamWriter'ı başlattığınızda, metnin daha önce orada olduğu geçersiz kılınır. Append özelliğini şu şekilde kullanabilirsiniz:

TextWriter t = new StreamWriter(path, true);

3
 else if (File.Exists(path)) 
{ 
  using (StreamWriter w = File.AppendText(path))
        {
            w.WriteLine("The next line!"); 
            w.Close();
        }
 } 

1
`` Using '' bloğunuz varsa, w.Close gereksizdir. Blok kullanımının sonunda imha aynı şeyi yapar.
Michael Freidgeim

-1 Bu yarış koşullarına tabidir ve yanlış davranışlara neden olabilir! Belki de File.Open(path, FileMode.Append, FileAccess.ReadWrite)döndürülen akış yoluyla dosya boyutunu kullanın ve kontrol edin.
ComFreek


2

Bunu dene.

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!");
    }
}

Redüktif File.AppendText(path)ve onunla kontrol etmeye gerek yok File.Exists(path). Ve If (not A) Else If (A)garip bir If / Else. Temelde bu soruda iyi bir şey yok, diğer cevabın redüktif versiyonu olan bir açıklama kodu yok.
xdtTransform

-1 Bu yarış koşullarına tabidir ve yanlış davranışlara neden olabilir! Belki de File.Open(path, FileMode.Append, FileAccess.ReadWrite)döndürülen akış yoluyla dosya boyutunu kullanın ve kontrol edin.
ComFreek

2

Sadece probleminizi çözecek File.AppendAllText () yöntemini kullanabilirsiniz. Bu yöntem, yoksa, dosyayı açıp kapatarak Dosya Oluşturma ile ilgilenir.

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

1

Microsoft belgelerinden, yoksa dosya oluşturabilir ve bu dosyayı tek bir çağrıda ekleyebilirsiniz File.AppendAllText Method (String, String)

.NET Framework (geçerli sürüm) Diğer Sürümler

Bir dosyayı açar, belirtilen dizeyi dosyaya ekler ve ardından dosyayı kapatır. Dosya yoksa, bu yöntem bir dosya oluşturur, belirtilen dizeyi dosyaya yazar ve sonra dosyayı kapatır. Ad alanı: System.IO Montajı: mscorlib (mscorlib.dll dosyasında)

Sözdizimi C # C ++ F # VB genel statik void AppendAllText (dize yolu, dize içeriği) Parametreler path Tür: System.String Belirtilen dizeyi eklenecek dosya. içindekiler Tür: System.String Dosyaya eklenecek dize.

AppendAllText


1
using(var tw = new StreamWriter(path, File.Exists(path)))
{
    tw.WriteLine(message);
}

Genellikle, kodun ne yapmak istediği ve başkalarını tanıtmadan sorunu neden çözdüğüne dair bir açıklama içeriyorsa, cevaplar çok daha yararlıdır.
Tim Diekmann
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.