【问题标题】:Detecting whether a file is locked by another process (or indeed the same process) [duplicate]检测文件是否被另一个进程(或实际上是同一个进程)锁定[重复]
【发布时间】:2010-09-30 07:17:21
【问题描述】:

这就是我目前的做法。我尝试在 FileShare 设置为 none 的情况下打开文件。所以我想要对文件的独占访问权。如果我不能得到它,那么它是一个很好的赌注其他人已锁定文件。

必须有更好更快的方法。有什么想法吗?

            try
            {
                using (FileStream fs = File.Open(GetLockFilename(), FileMode.Open, FileAccess.ReadWrite, FileShare.None))
                {
                    fs.Close();
                }
                // The file is not locked
            }
            catch (Exception)
            {
                // The file is locked
            }

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    没有必要先检查文件是否被锁定然后访问它,因为在检查和访问之间,一些其他进程可能仍然会锁定文件。所以,你做的是正确的,如果你成功了,就用文件做你的工作。

    【讨论】:

    • 另外,如果文件被锁定或是否是权限问题,您可以从引发的异常类型判断。
    • 没错。这与人们首先尝试检查文件是否存在然后尝试打开、删除或其他任何操作时所犯的错误相同。
    • 我认为异常是 FileAccessException...
    • 是DatabaseFileLockedException。
    【解决方案2】:

    事实是,即使您确实找到了一种方法来检查文件是否在您打开文件的下一行时被“锁定”,操作系统中的其他东西可能会尝试获取那个文件,你打开它的代码无论如何都会失败。无论如何,你必须在那里尝试/捕捉。因此,我说不。确实没有更好的解决方案。

    【讨论】:

      【解决方案3】:

      据我所知,没有调用来检查文件是否正在使用 - 您必须尝试打开它并像您一样处理异常。另一个问题是很难区分正在使用和不允许访问。

      【讨论】:

        【解决方案4】:

        要回答您的问题,为 FileInfo 类编写以下扩展方法会更有效:

              public static bool IsLocked(this FileInfo f)
            {
                    try 
                    {
                        string fpath = f.FullName;
                        FileStream fs = File.OpenWrite(fpath);
                        fs.Close();        
                        return false;
                    }
        
                    catch (Exception) { return true; }      
            }
        

        创建方法后,您可以像这样进行快速检查:

          FileInfo fi = new FileInfo(@"C:\4067918.TIF");
          if (!fi.IsLocked()) { //DO SOMETHING HERE; }
        

        【讨论】:

        • 这不会阻止竞争条件。此方法返回 false 后,文件仍可能立即被锁定。
        • 是的,同意。该方法不是万无一失的,但是根据手头的应用程序,在方法执行和下一行代码运行之间文件被锁定的可能性可能很小。总比不检查好。如果方法返回 true,您可以编写逻辑来处理该条件(例如,等待并重试 3 次等),然后再处理更一般的异常。
        猜你喜欢
        • 2016-10-08
        • 2013-01-09
        • 2014-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多