95

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

今天我发现自己想知道 WinXP 系统上的哪些程序打开了特定文件。有没有与 lsof 等效的实用程序?此外,有问题的文件是通过网络共享的,所以我不确定这是否会使事情复杂化。

4

10 回答 10

81

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

于 2008-08-19T04:48:32.587 回答
44

相当于lsof -p pidsysinternals 句柄和 listdlls 的组合输出,即

handle -p pid
listdlls -p pid

您可以使用 sysinternals 找出 pid pslist

于 2009-03-01T04:48:30.007 回答
11

尝试句柄FilemonRegmon也非常适合尝试找出 foo 程序对您的系统所做的事情。

于 2008-08-19T04:46:41.997 回答
7

一种等效的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

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

此外, listdlls句柄不会产生连续的表格形式,因此过滤文件名会隐藏 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 是打开这个文件的那个。

于 2012-03-21T10:36:34.907 回答
6

试试解锁器

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

于 2008-10-09T17:35:23.483 回答
6

如果文件是 .dll,那么您可以使用TaskList命令行应用程序查看是谁打开了它:

TaskList /M nameof.dll
于 2009-04-08T18:03:30.820 回答
4

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

于 2012-05-09T15:24:48.857 回答
2

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

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

于 2008-08-19T04:40:13.680 回答
2

使用 Process Explorer 查找进程 ID。然后使用Handle找出打开了哪些文件。

例如句柄 -p

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

于 2010-03-11T13:45:18.453 回答
2

OpenedFilesView的 Options 菜单下,有一个名为“Show Network Files”的菜单项。也许启用该功能后,上述实用程序会有一些用处。

于 2011-11-28T10:21:19.973 回答