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

时间:2011-01-27 13:54:31

标签: c# .net windows

  

可能重复:
  How do I find out which process is locking a file using .NET?

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

2 个答案:

答案 0 :(得分:4)

您可以尝试this question over here中提供的代码,或查看other suggestions here

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

但是这种方法存在的问题是,即使您可以确定文件已被锁定以及哪个应用程序具有文件锁定,您仍然需要应对竞争条件,例如......

一毫秒后

  • 文件未锁定
  • 确实持有锁的应用程序现在不是

然后两毫秒

  • 文件被锁定(再次)
  • 另一个应用程序有锁

然后三毫秒

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

...等

One suggestion是尝试在您的应用中获取文件句柄,并在您不能时捕获异常。

 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.
}

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

答案 1 :(得分:3)

请记住Ed指出的警告,稍后在Vista上,您可以使用Restart Manager API来完成此操作(即使您的应用程序不是安装程序)。

您创建一个新会话,注册感兴趣的文件,然后调用RmGetList以获取对该文件具有句柄的应用程序或服务的列表。如果这些应用程序在不涉及用户的情况下具有重新启动管理器功能,您甚至应该能够重新启动这些应用程序。

显然,Restart Manager是一个Win32 API,但您应该可以P / Invoke到它。 这篇文章:http://msdn.microsoft.com/en-us/magazine/cc163450.aspx 具有所需的P / Invoke签名以及以这种方式使用的示例。