如何检查文件锁定?
时间: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; }