我想知道在C#中是否可以枚举文件句柄,也许可以使用Win32API?对于窗口和进程句柄,这很容易实现,但似乎对于文件句柄不可能。虽然一些功能由NtQuerySystemInformation提供,但该方法正在逐步淘汰,因此不建议使用这种方法。
嗯,你知道这是可能的,SysInternals的Handle工具可以做到。NtQueryInformation不会被淘汰,它是Win32和“真正”的操作系统之间必不可少的低级接口。
然而,永远不会发生的是,允许迭代句柄的NtQueryInformation参数将被记录。因为事情并不止于此,有些笨蛋会使用它来调用CloseHandle()关闭他/她不想锁定的文件。这是一个非常好的方法来销毁你的硬盘内容。
拥有句柄的进程不知道句柄已经关闭。它将继续写入它,很可能完全忽略WriteFile()返回的“它没有起作用”的返回代码。这是无害的,直到程序打开另一个句柄,得到与先前关闭的句柄相同的值。现在它开始向句柄写入一堆垃圾(旨在用于上一个句柄)和新数据。彻底破坏它正在写入的任何内容。如果这是类似于关键任务数据库的东西,请启动备份磁带。
我在这里发现了一个在C#中列出文件句柄名称的工作示例...
向下滚动到最后一个线程,然后跟随那里的链接。请注意,一旦您下载代码,注释将是法语。碰巧我正在学习法语,所以我可以理解其中大部分。