gpt4 book ai didi

c# - FileStream 的 FileMode.OpenOrCreate 覆盖文件

转载 作者:行者123 更新时间:2023-11-30 20:25:18 26 4
gpt4 key购买 nike

DocumentationFileMode.OpenOrCreate “指定操作系统应该打开一个文件,如果它存在;否则,应该创建一个新文件”,这听起来像是它会打开文件并写入它。相反,该文件似乎被覆盖了。

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

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

public Logger()
{
// INTENT (but not reality): 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();
}
}

最佳答案

文档是正确的——但请注意,openappend 不是同义词。
FileMode.OpenOrCreate 不会导致 FileStream 构造函数批量删除先前存在的文件;相反,它会导致流从文件的开头开始。您观察到的是文件 contentsStreamWriter 覆盖,而不是 FileStream 构造函数立即替换文件。

您必须将流位置移动到文件末尾才能在末尾添加文本。为此,您可以使用 FileStream.Seek() 移动位置或将 FileMode 更改为 FileMode.AppendFileMode.Append 可能更惯用,但也需要将 FileAccess 设置为只写,而不是读写。否则,调用构造函数时会抛出异常。

选项 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);
}

关于c# - FileStream 的 FileMode.OpenOrCreate 覆盖文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52020383/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com