【问题标题】:Why does StreamWriter overwrite my file?为什么 StreamWriter 会覆盖我的文件?
【发布时间】:2012-10-15 10:54:59
【问题描述】:

我正在使用SteamWriter 将某些内容写入文本文件,但是它会用新数据覆盖旧数据。 如何确保它只会添加新数据而不是覆盖旧数据?
我的代码:

class Program
{
    const string filename = @"C:\log.txt";
    static void Main()
    {
        FileStream fs;
        fs = new FileStream(filename, FileMode.Create, FileAccess.Write);
        StreamWriter writer = new StreamWriter(fs);
        writer.WriteLine("test");

        writer.Close();
        fs.Close();
    }
}

【问题讨论】:

  • 作为旁注,我会使用using 而不是最后那个丑陋的关闭。 using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write) { using(var writer = new StreamWriter(fs) { writer.WriteLine("test"); } }

标签: c# filestream streamwriter


【解决方案1】:

如果你使用FileMode.Create,according to MSDN:

指定操作系统应该创建一个新文件。如果 文件已经存在,它将被覆盖。这需要 FileIOPermissionAccess.Write 权限。 FileMode.Create 是等价的 请求如果文件不存在,请使用 CreateNew; 否则,使用截断。如果文件已经存在但隐藏 文件,抛出 UnauthorizedAccessException 异常。

所以你需要使用FileMode.Append来代替,如果你想在文件末尾添加内容:

打开文件如果存在并查找文件末尾,或者 创建一个新文件。这需要 FileIOPermissionAccess.Append 允许。 FileMode.Append 只能与 文件访问。写入。试图在结束前寻求一个位置 文件抛出 IOException 异常,任何读取尝试都失败 并抛出 NotSupportedException 异常。

FileStream fs = new FileStream(filename, FileMode.Append, FileAccess.Write);

【讨论】:

  • 文档不清楚“它将被覆盖”是否意味着文件中的现有字节将被保留,只是被每次新的写入覆盖(即从文件开头覆盖当前数据)或者如果在写入新数据之前,整个文件将被截断。
【解决方案2】:

要附加到文件,您可以将流的位置更新到末尾。

...
using (FileStream fs = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.Write))
{
    fs.Seek(0, SeekOrigin.End);
    using (StreamWriter writer = new StreamWriter(fs))
    {
        // To append, update the stream's position to the end of the file
        writer.WriteLine("test");
    }
}
...

附带说明,如果您打算覆盖文件,并且原始文件的长度比新数据的长度长,您需要在完成写入后在基础文件流上使用 SetLength()出文件。换句话说,

    ...
    {
        writer.WriteLine("test");
        fs.SetLength(fs.Position);
    }
    ...

【讨论】:

  • 我认为您的意思是FileMode.OpenOrCreate,因为FileMode.Create 将覆盖文件,并且您的fs.Seek 应该在您使用FileStream 创建StreamWriter 之前完成
  • 感谢您指出,我一直在关注 OP 的代码,所以没有停下来思考这个问题!干杯。
【解决方案3】:
fs = new FileStream(filename, FileMode.Append, FileAccess.Write);

【讨论】:

    【解决方案4】:

    正如其他人指出的问题,我想我会建议一个更简单的解决方案

    File.AppendAllText(filename, "test");
    

    【讨论】:

      【解决方案5】:

      试试这个

      string path = your file path;
         using(StreamWriter sw = new StreamWriter(path,true))
                 {
      
                          sw.WriteLine("string here");
                 }
      

      【讨论】:

      • 这里的刷新是不必要的——关闭刷新。
      • 虽然我不得不说我不同意你打开文件的方法。我会使用using(StreamWriter sW = new StreamWriter("FILE", true)){
      • 现在该代码已损坏。去掉using里面的两个if,在true)后面加一个)
      • @Ruirize 现在?我没有 IDE 来测试它:( 抱歉
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-22
      • 2021-04-13
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多