我可以使用FileStream实现文件锁吗?
-
29-09-2019 - |
题
我可以使用 FileStream
构造函数可确保一个过程一次访问文件?以下代码可以工作吗?
public static IDisposable AcquireFileLock() {
IDisposable lockObj;
do {
// spinlock - continually try to open the file until we succeed
lockObj = TryOpenLockFile();
// sleep for a little bit to let someone else have a go if we fail
if (lockObj == null) Thread.Sleep(100);
}
while (lockObj == null);
return lockObj;
}
private static FileStream TryOpenLockFile() {
try {
return new FileStream(s_LockFileName, FileMode.Create, FileAccess.Read, FileShare.None);
}
catch (IOException) {
return null;
}
}
特别是与 FileMode.Create
原子WRT其他过程?我还应该使用其他东西吗?
编辑:更具体地说,这是在Microsoft CLR上使用一台计算机上的本地文件上的。
解决方案
这将做您想要的。 FileShare.None
是重要的部分。
如果所有作者应用程序都在同一台计算机上,您也可以使用 名为穆特克斯 要实现相同的目标而无需物理文件,或者如果您不在乎谁在文件上写下文件(仅此写作不是并发),则可以调节文件访问。这可以使您不必每次重新打开文件,并提供一个封锁语义而不是您的语义 Sleep
循环(更好的perf)。
请注意,任何进程都可以在文件(MUTEX)上深蹲,如果该名称不被视为秘密,则需要确保安全的信息。
其他提示
考虑到以下警告,这将起作用:
- 您在Windows上(在Linux通过Mono上,由于文件锁定为咨询,因此无法保持这种状态,因此您的方法始终成功)
- 您正在访问本地文件(SMB也可能工作,但是NFS或WebDav几乎不会)
- 捕捉IOEXCESTION可能太广泛了,您需要具体验证它由于违规而失败了
不隶属于 StackOverflow