5

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

5 回答 5

12

如果你使用FileMode.Create根据 MSDN

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

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

如果文件存在,则打开文件并查找文件末尾,或 创建一个新文件。这需要 FileIOPermissionAccess.Append 权限。FileMode.Append 只能与 FileAccess.Write 结合使用。试图在文件结尾之前寻找一个位置会引发 IOException 异常,并且任何读取尝试都会失败并引发 NotSupportedException 异常。

FileStream fs = new FileStream(filename, FileMode.Append, FileAccess.Write);
于 2012-10-25T09:29:09.273 回答
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);
    }
    ...
于 2015-12-19T04:27:54.613 回答
0

尝试这个

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

                    sw.WriteLine("string here");
           }
于 2012-10-25T09:28:34.300 回答
0
fs = new FileStream(filename, FileMode.Append, FileAccess.Write);
于 2012-10-25T09:30:34.550 回答
0

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

File.AppendAllText(filename, "test");
于 2012-10-25T09:36:40.680 回答