我如何以编程方式确定哪个应用程序正在锁定文件?

Mic*_*eth 9 .net c# windows

可能重复:
如何找出使用.NET锁定文件的进程?

我想复制一个文件,但它被另一个应用程序锁定,因此抛出了FileInUseException.我想告诉用户哪个应用程序正在锁定我正在尝试复制的文件..NET Framework中有没有办法做到这一点?如果没有这方面的知识,我会告诉用户使用Unlocker应用程序.

Ed *_*ess 4

您可以在此处尝试此问题中提供的代码,或者在此处查看其他建议

一般方法是枚举所有进程的句柄,获取这些句柄的文件路径,然后与您感兴趣的文件进行比较。

但这种方法的一个问题是,即使您可以确定文件被锁定以及哪个应用程序具有文件锁定,那么您仍然必须应对竞争条件,例如......

一毫秒后

  • 文件未锁定
  • 曾经持有锁的应用程序现在不再持有锁

然后两毫秒后

  • 文件被锁定(再次)
  • 不同的应用程序有锁

然后三毫秒后

  • 文件仍然被锁定
  • 另一个应用程序有锁

...ETC

一种建议是尝试在应用程序中获取文件句柄,并在无法获取时捕获异常。

 try
 {
    using (Stream stream = new FileStream("MyFilename.txt"))
   {
   }
 } catch {
   //check here why it failed and ask user to retry if the file is in use.
}
Run Code Online (Sandbox Code Playgroud)

当然,这无助于识别罪魁祸首,但至少您有一种更安全的方法来尝试访问该文件。