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

时间:2016-02-16 22:43:57

标签: c# linux mono locking

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

new FileStream("myfile.lock",FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None);
来自互联网的研究,我应该可以用advisory lock

来做
FileStream.Lock
但是,它不起作用。在ubuntu 14.04上用两个进程测试,它们都可以执行“FileStream.Lock(0,int.MaxValue)”。我希望后者会因source code而异常失败。

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

1 个答案:

答案 0 :(得分:3)

从单一邮件列表" http://mono.1490590.n4.nabble.com/File-Locking-td4663839.html"

获取帮助

以下是" Edward Ned Harvey(单声道)"

的答案
  

有点儿。根本问题是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 
}
  

对于Windows,只需指定FileAccess和FileShare即可   足够。对于linux,至少是ext4,文件可以同时读取   无论您为FileAccess和FileShare指定了什么。该   Lock()方法做了一些软锁。它并没有被强制执行   操作系统,但至少我们尝试过的所有情况,其他客户端应用程序荣誉   锁。没有深入研究它。