如何跨进程锁定/解锁文件

本文关键字:解锁 文件 锁定 何跨 进程 | 更新日期: 2023-09-27 18:35:06

使用在 Linux

上的单声道上运行的 C#,请注意下面的代码在 Windows 上运行良好,可以跨进程锁定文件,但不能通过单声道在 Linux 上锁定文件(ubuntu 14.04)

new FileStream("myfile.lock",FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None);

来自互联网的研究,我应该能够用咨询锁来做到这一点

FileStream.Lock

在 Ubuntu 14.04 上用两个进程测试,它们都可以执行"FileStream.Lock(0, int.最大值)"。我希望后者会失败,每个源代码都有异常。

有人知道有什么解决方案吗?

如何跨进程锁定/解锁文件

从单声道邮件列表"http://mono.1490590.n4.nabble.com/File-Locking-td4663839.html"获取帮助

以下是"爱德华·内德·哈维(单声道)"的答案引用

有点像。根本问题是OSX,Linux和Windows都 具有不同的底层文件锁定构造,然后当然, 甚至使用哪个文件系统也存在一些可变性。 我没有彻底找出每个操作系统的所有答案,或者 文件系统,我不知道在什么情况下这会很好 足够了,但这是我最终使用的,在条件下工作 我们需要它来工作:

using (var foo = new FileStream(filePath, FileMode.Open,FileAccess.ReadWrite, FileShare.None)) { // must include Write access in order to lock file 
    foo.Lock(0, 0); // 0,0 has special meaning to lock entire file regardless of length 
}

对于窗口,只需指定文件访问和文件共享即可 足够。对于 linux,至少 ext4,文件是可同时读取的 无论您为 FileAccess 和 FileShare 指定什么。这 Lock() 方法做了一些软锁。它不是由 操作系统,但至少我们尝试过的所有情况,其他客户端应用程序都尊重 锁。没有更深入地研究它。