为什么StreamWriter会覆盖我的文件?

时间:2012-10-25 09:26:35

标签: c# filestream streamwriter

我正在使用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();
    }
}

5 个答案:

答案 0 :(得分:12)

如果您使用FileMode.Createaccording to MSDN

  

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

因此,如果要将内容添加到文件末尾,则需要使用FileMode.Append

  

打开文件(如果存在)搜索到文件末尾,或者   创建新文件。这需要FileIOPermissionAccess.Append   允许。 FileMode.Append只能与。一起使用   FileAccess.Write。试图在结束之前寻找一个位置   file抛出IOException异常,任何读取尝试都失败   并抛出NotSupportedException异常。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

试试这个

string path = your file path;
   using(StreamWriter sw = new StreamWriter(path,true))
           {

                    sw.WriteLine("string here");
           }

答案 3 :(得分:0)

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

答案 4 :(得分:0)

正如其他人指出的那样,我认为我会建议一个更容易的解决方案

File.AppendAllText(filename, "test");