2010-04-09 85 views
7

我想知道是否有可能在c#中枚举文件句柄,也许使用Win32API。这对于窗口和进程句柄很容易完成,但似乎文件句柄不可行。在C中枚举文件句柄#

尽管NtQuerySystemInformation提供了一些功能,但这些功能正在逐步淘汰,因此不建议使用这种方法。

+0

可能的重复http://stackoverflow.com/questions/231547/tracing-which-process-that-has-opened-a-particular-file – 2010-04-10 00:00:37

回答

7

嗯,你知道这是可能的,Sysinternals的手柄工具做的。 NtQueryInformation不会被淘汰,它是Win32和“真实”操作系统之间的一个基本的低级接口。

然而,永远不会发生的是允许迭代句柄的NtQueryInformation参数将被记录。因为它不仅仅停留在那里,所以一些muppet会使用它来调用CloseHandle(),以便不想被锁定的文件上。哪个是非常好破坏硬盘内容的好方法。

拥有句柄的进程不知道句柄已关闭。它会继续写入,可能完全忽略WriteFile()中的“它没有工作”的返回码。在程序打开另一个句柄之前,它是无害的,并获得与之前关闭的值相同的值。现在它开始写入混合垃圾(专用于前一个句柄)和新数据到句柄。彻底摧毁任何正在写入的内容。如果这是关键任务数据库的话,请将备份磁带分开。