【发布时间】:2016-02-12 07:13:11
【问题描述】:
我需要操作文件的内容:
FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
StreamReader sr = new StreamReader(fs);
StreamWriter sw = new StreamWriter(fs);
newString = someStringTransformation(sr.ReadToEnd());
sw.Write(newString);
fs.flush();
fs.Close();
但是,上面添加了 newString 而不是用新的更改覆盖文件。需要这样做,以便在读取写入之间没有其他应用程序可以访问该文件,这就是我从 FileStream 对象创建读取器和写入器的原因。
我知道您可以创建一个将第二个参数设置为 false 的 StreanWriter,如 here 所述。但是,在创建上述 StreamWriter 时,这似乎不是参数之一。
【问题讨论】:
-
尝试刷新流并将其重新定位到文件的开头,然后写入,然后刷新写入器,然后截断文件。
-
另一种方法是创建另一个临时文件,将所有新内容保存到该文件中,然后删除旧文件并重命名新文件。
-
您尝试做的事情毫无意义,您无法防止另一个进程在打开文件前一微秒读取文件。
-
旁注:使用
IDisposable(例如FileStream)时,将其包装到using(FileStream fs = new FileStream..) {...}中比调用Close更好(您可能会在异常情况下发生资源泄漏)