gpt4 book ai didi

c# - 文件锁定 - 在锁定时读取然后写入

转载 作者:太空宇宙 更新时间:2023-11-03 16:40:07 25 4
gpt4 key购买 nike

我需要能够打开一个文件来读取它,并维护一个锁以拒绝同一应用程序的其他实例进行写访问,直到我将修改后的文件写回磁盘。该文件位于网络上的共享位置,应用程序实例可以位于网络上的任何计算机上。

我已经尝试将 FileStreamFileAccess.ReadWriteFileShare.Read 一起使用,并使用 Streamreader 来读取,然后使用 StreamWriter(在相同的 FileStream 上)进行写入,但这会损坏文件。 FileAccessFileShare 的其他排列似乎也没有解决我的基本问题。

所以我尝试在打开 StreamWriter 之前关闭 StreamReader,但这会更改 CanReadCanWrite 属性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 将文件锁定在“需要的地方”。

这显然对二进制固定长度数据更有效。如果您有可变长度数据(或者您需要自动更新文件的更多“区域”),那么它会变得更加复杂。通常你会因为这个原因使用数据库 :-)

关于c# - 文件锁定 - 在锁定时读取然后写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7914102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com