我正在使用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();
}
}
答案 0 :(得分:12)
如果您使用FileMode.Create
,according 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");