如何检查文件锁定?

时间:2020-03-05 18:37:33  来源:igfitidea点击:

有没有办法在不使用try / catch块的情况下检查文件是否被锁定?

现在,我所知道的唯一方法就是打开文件并捕获任何System.IO.IOException

解决方案

回答

不,不幸的是,如果我们考虑一下,该信息将毫无价值,因为文件可能会在下一秒被锁定(读取时间很短)。

为什么特别需要知道文件是否仍被锁定?知道这可能会给我们提供其他一些为我们提供好的建议的方式。

如果代码如下所示:

if not locked then
    open and update file

然后,在两行之间,另一个进程可以轻松地锁定文件,从而给我们带来我们试图避免始于的相同问题:异常。

回答

Then between the two lines, another process could easily lock the file, giving you the same problem you were trying to avoid to begin with: exceptions.

但是,通过这种方式,我们将知道问题是暂时的,并在以后重试。 (例如,我们可以编写一个线程,如果在尝试写入时遇到锁,它将继续重试直到锁消失。)

另一方面,IOException本身不够具体,以至于锁定是IO故障的原因。可能有一些原因不是暂时的。

回答

我们可以通过尝试先自己读取或者锁定文件来查看文件是否被锁定。

请在这里查看我的答案以获取更多信息。

回答

我们可以通过互操作在我们感兴趣的文件区域上调用LockFile。这不会引发异常,如果成功,我们将在文件的那部分(由进程持有)上拥有一个锁,该锁将被保持不变,直到我们调用UnlockFile或者进程终止。

回答

可以使用.NET FileStream类方法Lock和Unlock,而不是使用interop:

FileStream.Lock
http://msdn.microsoft.com/zh-CN/library/system.io.filestream.lock.aspx

FileStream.Unlock
http://msdn.microsoft.com/zh-CN/library/system.io.filestream.unlock.aspx

回答

当我遇到类似的问题时,我完成了以下代码:

public bool IsFileLocked(string filePath)
{
    try
    {
        using (File.Open(filePath, FileMode.Open)){}
    }
    catch (IOException e)
    {
        var errorCode = Marshal.GetHRForException(e) & ((1 << 16) - 1);

        return errorCode == 32 || errorCode == 33;
    }

    return false;
}