下面的代码:
var fs = new FileStream(@"C:\Users\Michał\Desktop\tools\test.txt",
FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
var fs2 = new FileStream(@"C:\Users\Michał\Desktop\tools\test.txt",
FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
int a = 0;
while (a < 3)
{
byte[] info = new UTF8Encoding(true).GetBytes("DEF_");
byte[] info2 = new UTF8Encoding(true).GetBytes("abc_");
fs.Write(info, 0, info.Length);
Thread.Sleep(100);
fs2.Write(info2, 0, info2.Length);
Thread.Sleep(1000);
++a;
}
fs.Close();
fs2.Close();
为什么结果是文件中只有“ abc_abc_abc”? FileShare.ReadWrite对我来说意味着其他进程/线程可以在FileStream ctor调用中同时写入此文件。
答案 0 :(得分:0)
您可以实现所需的行为,如下所示:
using (var fs = new FileStream("test.txt", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
using (var fs2 = new FileStream("test.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
{
byte[] info = new UTF8Encoding(true).GetBytes("DEF_");
byte[] info2 = new UTF8Encoding(true).GetBytes("abc_");
for (int i = 0; i < 3; i++)
{
fs.Seek(0, SeekOrigin.End);
fs.Write(info, 0, info.Length);
fs.Flush();
fs2.Seek(0, SeekOrigin.End);
fs2.Write(info2, 0, info2.Length);
fs2.Flush();
}
}
在写入之前,流的每个指针必须位于末尾。这是使用Seek
方法完成的。
写入后,您需要将缓冲区刷新到磁盘。这样可确保在开始下一次写入之前,流处于正确的状态。为此,请使用Flush
方法。
在其构造函数中创建流时,可以指定FileOptions.WriteThrough
。根据其描述,不应使用中间缓冲区。但是,如果没有Flush
方法,它仍然无法工作。也许专家会解释原因。