StreamWriterを使用してファイルに行を追加する


170

ファイルに行を追加したい。StreamWriterを使用しています:

StreamWriter file2 = new StreamWriter(@"c:\file.txt");
file2.WriteLine(someString);
file2.Close();

私のファイルの出力は互いに下にあるいくつかの文字列であるはずですが、このコードを実行するたびに上書きされる行は1つしかありません。

StreamWriterに既存のファイルに追加させる方法はありますか?


19
廃棄することを忘れないでくださいStreamWriter。これには、usingブロックの構文が適しています。
TheCodeKing、2011

1
File.AppendAllTextを使用して、ファイルへの非常に迅速な更新を行っているとき、私はストリームを心配したくない理由でもある- msdn.microsoft.com/en-us/library/ms143356.aspx
クリス・

@TheCodeKing-それを行うためのコードを見せてくれませんか?
2013年

4
@blastousing (var stream = new StreamWriter(..)) { stream.WriteLine(..); }
TheCodeKing

回答:


279

代わりにこれを使用してください:

new StreamWriter("c:\\file.txt", true);

StreamWriterコンストラクターのこのオーバーロードを使用して、ファイルを追加するか、ファイルを上書きするかを選択します。

C#4以降では、次の構文が提供されています。

new StreamWriter("c:\\file.txt", append: true);


13

ファイルに何かを書き込むたびに上記のコードをすべて実行ていると思います。ファイルのストリームが開かれるたびに、そのシークポインターが先頭に置かれるため、すべての書き込みによって、以前にあったものが上書きされます。

この問題は、2つの方法で解決できます。

file2 = new StreamWriter("c:/file.txt", true);

または明示的にストリームポインタを自分で再配置する:

file2 = new StreamWriter("c:/file.txt");
file2.BaseStream.Seek(0, SeekOrigin.End);

ファイルに10MBがあり、位置0から書き込みを開始したが10KBしかなかった場合、どうすればファイルに今書き込んだ10KBデータのみが含まれていることを確認できますか?
JobaDiniz 2017年

10

これを試して:

StreamWriter file2 = new StreamWriter(@"c:\file.txt", true);
file2.WriteLine(someString);
file2.Close();

7

これを交換してください:

StreamWriter file2 = new StreamWriter("c:/file.txt");

これとともに:

StreamWriter file2 = new StreamWriter("c:/file.txt", true);

true テキストを追加することを示します。



5

別のオプションは、System.IO.File.AppendTextを使用することです

これは、他のユーザーが指定したStreamWriterオーバーロードと同等です。

また、File.AppendAllTextは、ストリームを開いたり閉じたりすることを心配する必要なく、少し簡単なインターフェイスを提供します。ただし、自分で改行を入れることを心配する必要があるかもしれません。:)


5

実際、私のケースでは、BaseStream.Seekを使用したJonの回答(2011年9月5日9:37)のみが機能しました。ジョン、ありがとう!zipアーカイブされたtxtファイルに行を追加する必要がありました。

using (FileStream zipFS = new FileStream(@"c:\Temp\SFImport\test.zip",FileMode.OpenOrCreate))
{
    using (ZipArchive arch = new ZipArchive(zipFS,ZipArchiveMode.Update))
    {
        ZipArchiveEntry entry = arch.GetEntry("testfile.txt");
        if (entry == null)
        {
            entry = arch.CreateEntry("testfile.txt");
        }
        using (StreamWriter sw = new StreamWriter(entry.Open()))
        {
            sw.BaseStream.Seek(0,SeekOrigin.End);
            sw.WriteLine("text content");
        }
    }
}

3

もう1つの簡単な方法は、File.AppendTextUTF-8エンコードされたテキストを既存のファイルに追加するか、指定されたファイルが存在しない場合に新しいファイルに追加して、System.IO.StreamWriter

using (System.IO.StreamWriter sw = System.IO.File.AppendText(logFilePath + "log.txt"))
{                                                
    sw.WriteLine("this is a log");
}

1

この行を置き換えます:

StreamWriter sw = new StreamWriter("c:/file.txt");

このコードで:

StreamWriter sw = File.AppendText("c:/file.txt");

次に、次のようにテキストファイルに行を書き込みます。

sw.WriteLine("text content");
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.