如何检查文件锁定?

有没有办法检查一个文件是否被锁定而不使用try / catch块?

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

0
额外 编辑
意见: 3
这是一个古老的问题,所有旧的答案都不完整或错误。我添加了一个完整和正确的答案。
额外 作者 Eric J.,
我知道这并不是问题的答案,但有些正在寻求帮助的开发人员可能会有这样的选择:如果您使用System.Diagnostics.Process启动拥有该锁的进程,则可以使用.WaitForExit ()。
额外 作者 amalgamate,
问题在于除了锁定的文件以外,IOException可能会被抛出。
额外 作者 JohnFx,

5 答案

不,不幸的是,如果你仔细想想,这些信息无论如何都是毫无价值的,因为文件可能在下一秒被锁定(阅读:短时间段)。

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

如果你的代码看起来像这样:

if not locked then
    open and update file

然后在两行之间,另一个进程可以轻松锁定文件,从而为您提供了与之前尝试避免的相同问题:例外。

0
额外
是的,但独立检查文件是否被锁定是无用的,唯一正确的方法是尝试打开文件以满足需要该文件的目的,然后在该位置处理锁定问题。然后,如你所说,等待,或以另一种方式处理它。
额外 作者 Lasse Vågsæther Karl,
@Bart请详细说明,该方法定义在哪里,您可以提供一个链接吗?请注意,我的答案是2008年第三季度发布的,不同的.NET运行时和所有,但仍然....什么是 File.ReadWaitForUnlock
额外 作者 Lasse Vågsæther Karl,
现在可以获得锁定文件的进程。请参阅 stackoverflow.com/a/20623302/141172
额外 作者 Eric J.,
我认为最好做的是一个File.ReadWaitForUnlock(文件,超时)方法。并根据成功返回null或FileStream。我在这里遵循逻辑吗?
额外 作者 Bart Calixto,
@ LasseV.Karlsen根据你的回答核实我的答案。 ReadWaitForUnlock是我自己的方法,最后更改为TryOpenRead。
额外 作者 Bart Calixto,
虽然它当然不太可能,但你可以为访问权争辩。
额外 作者 ctusch,
如果文件被锁定,我们可以等一段时间再试一次。如果这是文件访问的另一种问题,那么我们应该传播异常。
额外 作者 DixonD,
@ LasseV.Karlsen进行抢先检查的另一个好处是,您可以在尝试可能的长时间操作和中途中断之前通知用户。中途发生的锁仍然是可能的,需要处理,但在很多情况下,这将有助于用户体验相当大。
额外 作者 Thiru,

您可以通过该区域上的互操作调用 LockFile 你不感兴趣的文件。这不会抛出异常,如果它成功,你将锁定该文件的一部分(由你的进程持有),该锁将被保留,直到你调用 UnlockFile 或您的进程死亡。

0
额外

您可以通过首先尝试读取或自行锁定来查看文件是否被锁定。

Please see my answer here for more information.

0
额外
然后,在这两行之间,另一个进程可以轻松锁定文件,从而为您提供了与之前尝试避免的相同问题:例外。

但是,通过这种方式,您会知道问题是暂时的,并在稍后重试。 (例如,你可以编写一个线程,如果在尝试写入时遇到锁定,则会一直重试,直到锁定消失。)

另一方面,IOException本身并不具有足够的特性,锁定是导致IO失败的原因。可能有些原因不是暂时的。

0
额外

而不是使用interop你可以使用.NET FileStream类的方法锁定和解锁:

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

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

0
额外
这确实是一个正确的答案,因为它使用户不仅可以锁定/解锁文件,而且还可以对文件的各个部分进行锁定/解锁。所有的“你不能这样做,没有交易”的评论可能会引起一个有效的关注,但没有用,因为他们假装功能不存在或不知何故被隐藏。
额外 作者 BrainSlugs83,
实际上,这不是一个解决方案,因为如果文件被锁定,您无法创建FileStream实例。 (将抛出异常)
额外 作者 Zé Carlos,