我正在寻找一种方法来确定 Windows 上进程打开的所有文件。这与这里的许多(已回答的)问题不同,因为我需要知道进程打开的所有文件,而不仅仅是我查找时打开的文件。这样,我就可以避免丢失已完全加载到内存中然后关闭的文件。以下是我尝试过的一些没有奏效的方法:
- SysInternals 的 ProcExp 和 Handle(都仅列出当前打开的文件)
- SysInternals 的 ProcMon(带有进程名称和 ReadFile 和 WriteFile 操作的过滤器)。这个让我很惊讶。为什么它不起作用?
我的测试用例是使用记事本从闪存驱动器打开一个文本文件,因此我不指望 ProcExp 或 Handle 能够工作(因为记事本会将所有内容读入内存,然后关闭文件)。不过,ProcMon 似乎应该可以工作。事实上,当我编辑文本文件并保存时,我可以看到 WriteFile 操作和文本文件的路径。不过,当我打开文件时,我能看到的唯一 ReadFile 操作是C:\Windows\Fonts\StaticCache.dat
。也许只是我的过滤器配置错误?或者其他工具是否更适合我?
答案1
所以,我确实想出了如何做到这一点。不幸的是,关于如何使用 ProcMon 的资源似乎并不多,而且我的过滤器实际上对我不利。下面是详细情况:
- 添加过滤器以包含要检查的进程
- 在上方栏的右侧(就在文件、编辑、事件等的下方),有五个图标,其中四个应默认突出显示。取消选择除“显示文件系统活动”(上面有放大镜的计算机)之外的所有图标。现在您应该只看到程序正在访问的文件,而不是通常的注册表项。
- 为了过滤掉它通常访问的垃圾 DLL 和配置文件,找出它们大多数位于哪个文件夹(通常是 C:\Windows)并添加如下过滤器:
'Path' 'Contains' [your folder] 'Exclude'
- 作为步骤 3 的替代方法,添加如下过滤器以排除 dll:
'Path' 'Contains' '.dll' 'Exclude'
现在您应该几乎只看到程序正在打开的非依赖文件和文件夹。