【问题标题】:Lock file by one process一个进程锁定文件
【发布时间】:2013-11-14 08:03:48
【问题描述】:

我有一个应用程序同时运行多个进程来读取和写入文件。

private Process PrepareProcess(string workingDirName, string scriptPath, string[] args) {
        var process = new Process {
            StartInfo = {
                WorkingDirectory = workingDirName,
                FileName = scriptPath,
                Arguments = string.Format(string.Join(" ", args))
            }
        };
        return process;
    }

我需要确保该文件只能由一个进程同时修改。该怎么做?

该进程将运行将修改文件的外部脚本。我无法管理如何打开文件。我需要管理正在运行的进程。

谢谢!

【问题讨论】:

  • 一个文件不能被多个进程同时修改。如果发生这种情况,您将收到异常。
  • @Muctadir 这不是真的。见FileShare.WriteFileShare.ReadWrite
  • 是您开始的流程(使用您拥有的来源)还是一些外部第三方?
  • 谢谢。我忽略了这一点。

标签: c# .net process file-locking


【解决方案1】:

您可以使用“命名互斥锁”。它可以帮助您说“嘿等等,正在处理该文件!”。您可以等待或忽略该文件。

看看Mutex class

另外值得注意的是,默认情况下,如果您打开文件,FileShare 将是 None,这意味着 在我关闭文件之前不要与任何人共享访问权限。因此,当尝试在另一个进程中访问时它会失败。你不能同时修改它。为了防止失败和处理异常以及所有使用“Mutex”是一种优雅的方式。

【讨论】:

    【解决方案2】:

    打开文件时将FileShare.None 传递给File.Open

    这将阻止多个进程同时写入文件的任何尝试。不利的一面是,如果一个进程在另一个进程已经打开文件时尝试打开该文件,那么第二次尝试将失败。如果这是一个问题,那么您可能需要使用互斥锁来序列化访问。使用互斥锁的好处是它允许第二个进程阻塞并等待文件可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-29
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多