在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而异常失败。
任何人都知道有什么解决方案吗?
答案 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()方法做了一些软锁。它并没有被强制执行 操作系统,但至少我们尝试过的所有情况,其他客户端应用程序荣誉 锁。没有深入研究它。