如何确定Windows中是否打开了特定文件?[关闭]


87

我最喜欢的Linux工具之一是lsof-真正的瑞士军刀!

今天,我发现自己想知道WinXP系统上的哪些程序打开了特定文件。有与lsof等效的工具吗?此外,有问题的文件是通过网络共享进行的,因此我不确定是否会使问题复杂化。

Answers:


73

使用Sysinternals Suite中的Process Explorer,Find Handle或DLL函数将让您搜索打开该文件的过程。


这真的回答了这个问题吗?Process Explorer使您可以查看针对特定进程/句柄/ dll /什么打开的文件,但这是反向映射。看到我对这个问题的回答stackoverflow.com/questions/15708/…
格雷格·马特斯

6
是的,它确实。单击“查找句柄”或“ Dll”(或按Ctrl-F键),键入要搜索的文件的名称,最后得到一个打开该文件的进程列表。
杰·霍法克

现在,Process Explorer已被重命名并捆绑到“ Process Monitor”中。
马修·麦卡洛

7
@MatthewMcCullough有参考吗?您不正确,Process ExplorerProcess Monitor是两个不同的实用程序。
Alois Mahdal

2
Process Explorer是否具有命令行界面?
Anderson Green

40

等效的lsof -p pid是sysinternals句柄和listdlls的组合输出,即

handle -p pid
listdlls -p pid

您可以使用sysinternals找出pid pslist


这是否带有Windows 10之类的标准Windows安装?
莫滕

10

尝试处理FilemonRegmon也非常适合尝试找出duce程序foo对系统的作用。


从Windows 2000 SP4,Windows XP SP2,Windows Server 2003 SP1和Windows Vista开始,在Windows版本上,@ slipsec FileMon和Regmon现在已替换为Process Monitor v3.2
2015年

6

等效的lsof可以从Sysinternals的handlelistdlls中组合输出,即:

c:\SysInternals>handle
[...]
------------------------------------------------------------------------------
gvim.exe pid: 5380 FOO\alois.mahdal
   10: File  (RW-)   C:\Windows
   1C: File  (RW-)   D:\some\locked\path\OpenFile.txt
[...]

c:\SysInternals>listdlls
[...]
------------------------------------------------------------------------------
Listdlls.exe pid: 6840
Command line: listdlls

  Base        Size      Version         Path
  0x00400000  0x29000   2.25.0000.0000  D:\opt\SysinternalsSuite\Listdlls.exe
  0x76ed0000  0x180000  6.01.7601.17725  C:\Windows\SysWOW64\ntdll.dll
[...]

c:\SysInternals>listdlls

不幸的是,您必须“以管理员身份运行”才能使用它们。

而且listdllhandle不会产生连续的表格形式,因此过滤文件名将隐藏PID。findstr /c:pid: /c:<filename>虽然应该可以使您与这两个实用程序非常接近

c:\SysinternalsSuite>handle | findstr /c:pid: /c:Driver.pm
System pid: 4 \<unable to open process>
smss.exe pid: 308 NT AUTHORITY\SYSTEM
avgrsa.exe pid: 384 NT AUTHORITY\SYSTEM
[...]
cmd.exe pid: 7140 FOO\alois.mahdal
conhost.exe pid: 1212 FOO\alois.mahdal
gvim.exe pid: 3408 FOO\alois.mahdal
  188: File  (RW-)   D:\some\locked\path\OpenFile.txt
taskmgr.exe pid: 6016 FOO\alois.mahdal
[...]

在这里我们可以看到gvim.exe是打开此文件的文件。


5

尝试解锁

Unlocker站点上有一个漂亮的图表(单击链接后向下滚动),该图表显示了与其他工具的比较。显然,这样的比较通常是有偏见的,因为它们通常是由工具作者编写的,但是图表至少列出了备选方案,以便您可以自己尝试。


4
解锁仅列出锁定的文件,不列出打开的文件。大多数Windows软件会锁定它使用的DLL,但不会锁定您的文档。
Tobias

5

如果文件是.dll,则可以使用TaskList命令行应用查看打开该文件的人

TaskList /M nameof.dll

3

有一个程序“ OpenFiles”,似乎是Windows 7的一部分。似乎可以执行您想要的操作。它可以列出远程用户打开的文件(通过文件共享),并且在调用“ openfiles / Local on”并重新启动系统后,它应该能够显示在本地打开的文件。据说后者会产生性能损失。


1
我到这里来寻找一种方法来找出谁阻止了我删除文件夹并避免了重新启动,我发现我需要的命令需要一个配置设置……您猜对了……需要重新启动。窗户非常好。
古斯

伙计们,请注意openfiles命令需要很长时间才能运行(大约4分钟)!
NH。

2

如果右键单击“计算机”(或“我的电脑”)图标,然后从弹出菜单中选择“管理”,将带您到计算机管理控制台。

在其中的“系统工具\共享文件夹”下,您将找到“打开文件”。这可能与您想要的接近,但是如果文件在网络共享上,则需要在文件所在的服务器上执行相同的操作。


3
请注意,这仅显示其他网络用户打开的共享文件。它无助于查找在本地系统上打开的文件。在服务器上执行此操作可能会告诉您哪个用户打开了文件,但不会告诉您该用户计算机上的哪个程序。Process Explorer(如@JayHofacker所述)对我来说效果很好。
tomlogic

2

使用进程资源管理器查找进程ID。然后使用句柄找出打开了哪些文件。

例如句柄-p

我喜欢这种方法,因为您正在使用Microsoft本身的实用程序。


如果只有我们拥有这些代码的源代码
graywolf '16

2

OpenedFilesView的“选项”菜单下,有一个名为“显示网络文件”的菜单项。也许启用了该功能,上述实用程序就会有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.