Xia*_* Wu 6 c# linux mono locking
使用在 Linux 上运行在 mono 上的 C#,请注意以下代码在 windows 上运行良好,可以跨进程锁定文件,但在 linux 上无法通过 mono (ubuntu 14.04)
new FileStream("myfile.lock",FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None);
Run Code Online (Sandbox Code Playgroud)
来自互联网的研究,我应该可以用咨询锁来做到这一点
FileStream.Lock
Run Code Online (Sandbox Code Playgroud)
但是,它不起作用。在 ubuntu 14.04 上用两个进程测试,它们都可以执行“FileStream.Lock(0, int.MaxValue)”。我希望后一个会失败,每个源代码都有异常。
有谁知道有什么解决办法吗?
从单声道邮件列表“ 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
}
Run Code Online (Sandbox Code Playgroud)
对于 Windows,只需指定 FileAccess 和 FileShare 就足够了。对于 linux,至少是 ext4,无论您为 FileAccess 和 FileShare 指定什么,文件都可以同时读取。Lock() 方法做了一些软锁。它不是由操作系统强制执行的,但至少在我们尝试过的所有情况下,其他客户端应用程序都会接受锁定。没有深入研究。
| 归档时间: |
|
| 查看次数: |
2206 次 |
| 最近记录: |