【问题标题】:Append lines to a file using a StreamWriter使用 StreamWriter 将行附加到文件
【发布时间】:2011-11-10 11:54:59
【问题描述】:

我想在我的文件中添加行。我正在使用 StreamWriter:

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

我的文件的输出应该是多个相互下方的字符串,但我只有一行,每次运行此代码时都会被覆盖。

有没有办法让 StreamWriter 追加到现有文件?

【问题讨论】:

  • 别忘了处置StreamWriterusing 块是更好的语法。
  • 这也是为什么我在使用 File.AppendAllText 对文件进行非常快速的更新时不担心流的原因 - msdn.microsoft.com/en-us/library/ms143356.aspx
  • @TheCodeKing - 你能告诉我一些代码吗?
  • @blasto using (var stream = new StreamWriter(..)) { stream.WriteLine(..); }

标签: c# streamwriter


【解决方案1】:

改用这个:

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

通过 StreamWriter 构造函数的这种重载,您可以选择是追加文件还是覆盖它。

C# 4 及更高版本提供以下语法,有些人认为这些语法更易读:

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

【讨论】:

    【解决方案2】:
     using (FileStream fs = new FileStream(fileName,FileMode.Append, FileAccess.Write))
     using (StreamWriter sw = new StreamWriter(fs))
     {
        sw.WriteLine(something);
     }
    

    【讨论】:

      【解决方案3】:

      我假设您每次向文件写入内容时都在执行上述代码的全部。每次打开文件的流时,它的查找指针都会定位在开头,因此所有写入最终都会覆盖之前的内容。

      你可以通过两种方式解决这个问题:要么用方便的方式

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

      或者通过自己显式地重新定位流指针:

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

      【讨论】:

      • 如果文件有 10mb 并且我从位置 0 开始写入,但只有 10kb,我如何确保文件 only 包含我刚刚写入的 10kb 数据?
      【解决方案4】:

      试试这个:

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

      【讨论】:

        【解决方案5】:

        替换这个:

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

        用这个:

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

        true 表示它附加文本。

        【讨论】:

          【解决方案6】:

          使用 this StreamWriter constructor 和第二个参数 - true

          【讨论】:

            【解决方案7】:

            另一个选项是使用System.IO.File.AppendText

            这相当于其他人给出的 StreamWriter 重载。

            另外File.AppendAllText 可能会提供一个稍微简单的界面,而不必担心打开和关闭流。尽管您可能需要担心添加自己的换行符。 :)

            【讨论】:

              【解决方案8】:

              实际上,只有 Jon 对 BaseStream.Seek 的回答(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");
                      }
                  }
              }
              

              【讨论】:

                【解决方案9】:

                一种更简单的方法是使用File.AppendText,它将 UTF-8 编码文本附加到现有文件,如果指定文件不存在,则附加到新文件并返回 System.IO.StreamWriter

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

                【讨论】:

                  【解决方案10】:

                  替换这一行:

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

                  使用此代码:

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

                  然后将您的行写入文本文件,如下所示:

                  sw.WriteLine("text content");
                  

                  【讨论】:

                    【解决方案11】:

                    你可以这样使用

                     using (System.IO.StreamWriter file =new System.IO.StreamWriter(FilePath,true))
                                 {
                                        
                                        
                                `file.Write("SOme Text TO Write" + Environment.NewLine);         
                                        
                                 }
                            
                    

                    【讨论】:

                      猜你喜欢
                      • 2010-11-12
                      • 2019-06-11
                      • 2015-02-02
                      • 2012-02-09
                      • 2016-12-03
                      • 2011-12-06
                      • 1970-01-01
                      • 2012-11-18
                      • 1970-01-01
                      相关资源
                      最近更新 更多