我有一些代码引发了以下异常:
System.IO.IOException: The process cannot access the file 'MyFileName' because it is being used by another process.
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive)
at System.IO.Directory.Delete(String path, Boolean recursive)
at MyCodeSomewhere...
通常我知道这意味着我在某个地方有例外而没有整理相关的(例如)StreamReader
。
偶尔(只是偶尔,通常这是我的错)我得到的情况是,我的程序之外的东西锁定了文件(例如我的文本编辑器,这仍然是我的错,但不比引起的错误更令人讨厌我没有整理自己)。
我是否可以通过编程方式使用某种技术来检测哪个进程导致文件不可用?
方法GetProcessNameCausingMeGrief
会怎样?
catch (IOException ioEx)
{
string processName = GetProcessNameCausingMeGrief(ioEx);
if (processName == Process.GetCurrentProcess())
{
throw new ApplicationException("Oops, this code still has it's own file locked", ioEx);
}
throw;
}
答案 0 :(得分:1)
这很难做到。可以读取已打开句柄的列表,但是当您需要通过打开的句柄获取进程名称时,您需要访问内核内存(ms设计缺陷)。这就是为什么像Unlocker这样的程序依赖于特殊编写的驱动程序(并且在旧系统,x64系统等方面存在问题)。
但是,如果您在Vista下工作,那么您可以使用技巧并获取使用重启管理器锁定文件的进程。阅读更多here (Restart Manager and Generic Method Compilation)。
更新:有一种方法可以检测Windows XP上打开特定文件的程序。有些程序(尽管它们数量很少,我只知道ms office)将引用放入全局运行对象表中,因此您可以提取此类信息。这种方法很棘手,正如我之前所说,很少有程序会这样做,但这仍然是一种选择。
Here you can find FileLocker class通知Windows资源管理器有关已使用的文件。您需要从此类中反转逻辑以查找使用特定文件的程序。