尝试在C#中枚举Windows系统上的所有打开文件。我找不到本地方法来做,除了使用NtQuerySystemInformation API之外还有其他方法吗?
谢谢。
答案 0 :(得分:2)
是的,这是故意不包含在文档化的API中。枚举打开的文件永远不能在多任务操作系统上可靠地工作,您无法“冻结”操作系统并阻止其他进程在枚举时打开和关闭文件。竞争条件无法解决。唯一记录的方法是尝试打开没有共享的文件。
是的,NtQuerySystemInformation是后门。由SysInternals的Handle实用程序使用。由他们维护,因为每个新版本的Windows都需要更新该实用程序。
答案 1 :(得分:0)
您可以通过首先枚举系统上的所有句柄,然后获取每个句柄文件句柄的文件名来实现。
这是我的一个老程序,它枚举句柄,找到那些是某个进程的进程句柄并打印它们。您需要将其从进程句柄更改为文件句柄。 http://nopaste.info/eb9917d719.html但它使用NtQuerySystemInformation。
这描述了如何从句柄中获取文件名: http://msdn.microsoft.com/en-us/library/aa366789(VS.85).aspx