如何在C#中按进程ID获取打开文件句柄列表?我想深入挖掘并获取文件名。寻找等效于进程资源管理器所做的编程方法。很可能需要使用Interop。考虑对此进行悬赏,实现过程相当复杂。
哎呀,这个从托管代码中完成会很困难。
在codeproject上有一个示例
大部分的工作可以通过Interop来完成,但你需要一个驱动程序来获取文件名,因为它位于内核的地址空间。Process Explorer将驱动程序嵌入了其资源中。从C#进行所有连接并支持64位和32位,将是非常头痛的。
看看这个文件: http://vmccontroller.codeplex.com/SourceControl/changeset/view/47386#195318
然后使用:
DetectOpenFiles.GetOpenFilesEnumerator(processID);
演示:
using System;
using System.Diagnostics;
namespace OpenFiles
{
class Program
{
static void Main(string[] args)
{
using (var openFiles = VmcController.Services.DetectOpenFiles.GetOpenFilesEnumerator(Process.GetCurrentProcess().Id))
{
while (openFiles.MoveNext())
{
Console.WriteLine(openFiles.Current);
}
}
Console.WriteLine();
Console.ReadKey();
}
}
}
它依赖于程序集 System.EnterpriseServices
您还可以运行由Mark Rusinovich创建的命令行应用程序Handle, 并解析输出。
NtQuerySystemInformation
函数查询所有句柄,然后从那里开始。这个Google 群组讨论有详细信息。Handle是一款很棒的程序,链接到codeproject也不错。
@Brian 代码的原因是handle.exe不可再分发,他们也没有发布源代码。
看起来在.Net中不容易做到这一点,因为需要嵌入式设备驱动程序才能访问信息。这在typical .net 编程中无法完成,需要使用非托管DLL。与typical .net编程相比,它涉及相对较深的内核代码。我很惊讶WMI没有暴露这个功能。
也许可以使用命令行工具:
OpenedFilesView v1.50 - 查看系统中已打开/锁定的文件(共享冲突问题)