似乎问题在于这种File.Exists()
检查是在内部完成的,如果文件被隐藏(例如,尝试对FileMode.Create
已经存在的文件进行检查),则会失败。
因此,FileMode.OpenOrCreate
即使文件被隐藏,也可以用来确保打开或创建文件,或者只是在文件FileMode.Open
不存在时不想创建它。
使用时FileMode.OpenOrCreate
,文件不会被截断,所以你应该在最后设置它的长度,以确保文本结束后没有剩余。
using (FileStream fs = new FileStream(filename, FileMode.Open)) {
using (TextWriter tw = new StreamWriter(fs)) {
// Write your data here...
tw.WriteLine("foo");
// Flush the writer in order to get a correct stream position for truncating
tw.Flush();
// Set the stream length to the current position in order to truncate leftover text
fs.SetLength(fs.Position);
}
}
如果您使用 .NET 4.5 或更高版本,则会出现一个新的重载,该重载会阻止对StreamWriter
底层流的处理。然后可以更直观地编写代码,如下所示:
using (FileStream fs = new FileStream(filename, FileMode.Open)) {
using (TextWriter tw = new StreamWriter(fs, Encoding.UTF8, 1024, true)) {
// Write your data here...
tw.WriteLine("foo");
}
// Set the stream length to the current position in order to truncate leftover text
fs.SetLength(fs.Position);
}