我可以使用 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可能太广泛了,您需要具体验证它由于违规而失败了
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top