我可以使用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上使用单台计算机上的本地文件。
答案 0 :(得分:2)
这将做你想要的。 FileShare.None
是重要的一部分。
如果所有作家应用程序都在同一台计算机上,您也可以使用named Mutex来实现相同的目标,而不需要物理文件,或者如果您不关心谁写入文件,则调解文件访问权限文件最后(只是写入不是并发)。这可以使您不必每次都重新打开文件,并提供阻塞语义而不是Sleep
循环(更好的性能)。
请注意,如果名称不被视为机密,任何进程都可以蹲在您的文件(Mutex)上,即需要保持安全的信息。
答案 1 :(得分:1)
考虑到以下警告,这将有效: