FileStream的FileMode.OpenOrCreate覆盖文件

时间:2018-08-25 19:01:08

标签: c# filestream streamwriter

文档说FileMode.OpenOrCreate“指定操作系统应该打开一个文件(如果存在);否则,应该创建一个新文件”,这听起来像它将打开该文件并将其写入。而是,文件似乎被覆盖。

如何添加文件而不是覆盖文件?

class Logger : IDisposable
{
    private FileStream fs;
    private StreamWriter sw;

    public Logger()
    {
        // Will create file if one does not exist, otherwise opens existing file
        fs = new FileStream("log.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
        sw = new StreamWriter(fs, Encoding.UTF8);
    }

    public void Log(string message)
    {
        sw.WriteLine(message);
        sw.Flush();
        fs.Flush();
    }

    public void Dispose()
    {
        sw?.Dispose();
        fs?.Dispose();
    }
}

1 个答案:

答案 0 :(得分:3)

文档是正确的-但请注意 open append 不是同义词。 FileMode.OpenOrCreate不会覆盖文件,但是如果已经存在,则流确实从文件的开头开始。您正在观察的是内容StreamWriter覆盖,而不是FileStream构造函数覆盖文件。

您必须将流位置移动到文件的末尾才能在末尾添加文本。为此,您可以使用FileStream.Seek()移动位置,或将FileMode更改为FileMode.Append但是,使用FileMode.Append还需要将流设置为只写而不是读写。

选项1(FileMode.OpenOrCreateFileAccess.ReadWrite

public Logger()
{
    // Will create file if one does not exist, otherwise opens existing file
    fs = new FileStream("log.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
    // Set stream position to end-of-file
    fs.Seek(0, SeekOrigin.End);
    sw = new StreamWriter(fs, Encoding.UTF8);
}

选项2(FileMode.AppendFileAccess.Write

public Logger()
{
    // Will create file if one does not exist, otherwise appends to existing file
    fs = new FileStream("log.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
    sw = new StreamWriter(fs, Encoding.UTF8);
}