我有一个带有AutoFlush = true属性的StreamWriter。但是,当我随机打开它时,我仍然看到文件只是部分写入。我在任何给定的时间内写了一个需要完全写入(JSON)的文件。
var sw = new StreamWriter("C:\file.txt", true /* append */, Encoding.ASCII) { AutoFlush = true };
sw.WriteLine("....");
// long running (think like a logging application) -- 1000s of seconds
sw.Close();
在sw.WriteLine()调用和sw.Close()之间,我想打开文件,并始终使用正确的数据格式",即我的行应该是完整的。
当前的想法:
增加FileStream(和/或StreamWriter)的内部缓冲区,让它们说128KB。然后每128KB-1,在FileStream对象上调用.Flush()。这引出了我的下一个问题,当我调用Flush()时,我应该在调用它之前获取Stream.Position并执行File.Lock(Position,128KB-1)吗?或者Flush会照顾好吗?
基本上我不希望读者能够阅读Flush()之间的内容,因为它可能会被部分破坏。
答案 0 :(得分:1)
using (StreamWriter sw = new StreamWriter("FILEPATH"))
{
sw.WriteLine("contents");
// if you open the file now, you may see partially written lines
// since the sw is still working on it.
}
// access the file now, since the stream writer has been properly closed and disposed.
答案 1 :(得分:0)
如果您需要一个永远不会半写入的“类似日志”的文件,那么方法就是不要保持打开状态。
每次您要写入文件时,都应实例化一个新的FileWriter,它将在释放文件时刷新文件内容,如下所示:
private void LogLikeWrite(string filePath, string contents)
{
using (StreamWriter streamWriter = new StreamWriter(filePath, true)) // the true will make you append to the file instead of overwriting its contents
{
streamWriter.Write(contents);
}
}
这样,您的写操作将立即被刷新。
答案 2 :(得分:0)
如果要在进程之间共享文件,除非您产生某种类型的锁定机制,否则您将处于竞争状态。参见https://stackoverflow.com/a/29127380/892327。这确实要求您能够同时修改两个过程。
一种替代方法是让进程A在指定位置等待文件。进程B写入中间文件,并且B刷新后,该文件被复制到进程A期望该文件所在的位置,以便可以使用该文件。