可能重复:
How do I find out which process is locking a file using .NET?
我想复制一个文件,但它被另一个应用程序锁定,因此抛出了FileInUseException。我想告诉用户哪个应用程序正在锁定我正在尝试复制的文件。 .NET Framework中有没有办法做到这一点?如果没有这方面的知识,我会告诉用户使用Unlocker应用程序。
答案 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签名以及以这种方式使用的示例。