我需要能够打开一个文件来读取它,并维护一个锁以拒绝同一应用程序的其他实例进行写访问,直到我将修改后的文件写回磁盘。该文件位于网络上的共享位置,应用程序实例可以位于网络上的任何计算机上。
我已经尝试将 FileStream 与 FileAccess.ReadWrite 和 FileShare.Read 一起使用,并使用 Streamreader 来读取,然后使用 StreamWriter(在相同的 FileStream 上)进行写入,但这会损坏文件。 FileAccess 和 FileShare 的其他排列似乎也没有解决我的基本问题。
所以我尝试在打开 StreamWriter 之前关闭 StreamReader,但这会更改 CanRead 和 CanWrite 属性FileStream,所以我还是写不出来。
显然我采取了错误的方法,所以有人可以告诉我应该如何处理这个问题吗?这似乎是一件很常见的事情 - 编辑文件并阻止写访问,直到保存编辑的文件。
请您参考如下方法:
如果要写入文件,则需要独占文件访问权限,否则其他程序可以读取部分写入的数据(您的写入不是原子的)。有解决方案,但它们非常复杂。
解决方案可能是这样的:
static bool Read(FileStream fs, byte[] data, long position)
{
fs.Seek(position, SeekOrigin.Begin);
if (fs.ReadByte() == 0)
{
// Block of data not finished writing
return false;
}
fs.Read(data, 0, data.Length);
return true;
}
static bool Write(FileStream fs, byte[] data, long position)
{
try
{
fs.Lock(position, data.Length + 1);
fs.Seek(position, SeekOrigin.Begin);
fs.WriteByte(0);
fs.Write(data, 0, data.Length);
fs.Seek(position, SeekOrigin.Begin);
fs.WriteByte(1);
fs.Unlock(position, data.Length + 1);
return true;
}
catch (IOException)
{
return false;
}
}
static bool Append(FileStream fs, byte[] data)
{
return Write(fs, data, fs.Length);
}
你总是打开 FileStream 作为
FileStream fs1 = new FileStream("Test.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
在data 之前有一个“保护字节”,表明数据是否正在写入。如果它正在被写入,那么读取它将会失败。使用 FileStream.Lock 将文件锁定在“需要的地方”。
这显然对二进制固定长度数据更有效。如果您有可变长度数据(或者您需要自动更新文件的更多“区域”),那么它会变得更加复杂。通常你会因为这个原因使用数据库 :-)
