Skip to main content
 首页 » 编程设计

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

2024年01月11日28wayfarer

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

我已经尝试将 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 将文件锁定在“需要的地方”。

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