2010-03-23 39 views
0

我遇到了一个很常见的问题,“该进程无法访问该文件,因为它正在被另一个进程使用。”C#如何判断哪个进程正在使用文件?

现在我几乎可以确定访问此文件的唯一过程来自我写的代码,并且我一直在使用using语句来访问它。

但是要100%确定,是否有无论如何检查这个编程方式,当这种错误发生?

回答

4

Sysinternals Suite中还有一个小工具handle.exe,它完全符合您的需求。从命令行使用它:

handle.exe -a <filename> 

当然,在Vista和Windows 7下,此工具必须运行提升。

+0

当然,这不是一个“编程”检查,它是一个单独的命令行工具。但那些也可以自动化。 – 2010-03-23 23:15:23

0

例如资源工具包中的oh.exe和sysInternals中的进程资源管理器都显示谁在使用什么

他们两人都使用C#中不可用的技术。

+2

在c#中不可用,即使是不安全的win32调用和interop? – 2010-03-23 04:13:38

+0

有几件事情不能用C#完成(即使使用所提到的高级技术),其中包括驱动程序开发和DLL注入。然而,看起来获取句柄列表在用户模式API ZwQuerySystemInformation(SystemHandleInformation)中是可用的,它应该可以被p/invoke调用。它的进程监视器具有不能使用C#复制的功能。 – 2010-03-23 23:22:11

0

Windows Vista增加了一项新功能GetRunningObjectTable,您可以使用该功能来检测哪个程序打开了一个文件。这只适用于Vista +,并且只有在打开文件的应用程序实际支持IFileIsInUse(例如Office支持它,但大多数第三方应用程序可能不支持)时才可用。

除此之外,这种实现的常用方法是打开每个进程,枚举已打开的文件句柄并搜索文件名。这是相当低级的,并且需要相当多的P/Invoke才能在C#中实现,但这不是不可能的。

打开Process Explorer并让它执行搜索通常很容易。

相关问题