如何确定特定文件是否在Windows中打开?

时间:2008-08-19 04:37:35

标签: windows linux command-line filesystems

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

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

10 个答案:

答案 0 :(得分:67)

使用Sysinternals Suite中的Process Explorer,查找句柄或DLL函数将允许您搜索打开该文件的进程。

答案 1 :(得分:39)

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

handle -p pid
listdlls -p pid

你可以找到sysinternals pslist的pid。

答案 2 :(得分:9)

试试HandleFilemon& Regmon也非常适合尝试弄清楚duo程序foo对你的系统做了什么。

答案 3 :(得分:6)

一个等效的 lsof 可以是来自Sysinternals的句柄 listdlls 的组合输出,即:

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

答案 4 :(得分:5)

尝试Unlocker

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

答案 5 :(得分:5)

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

TaskList /M nameof.dll

答案 6 :(得分:4)

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

在那里,在系统工具\共享文件夹下,您将找到“打开文件”。这可能接近你想要的,但如果文件在网络共享上,那么你需要在文件所在的服务器上做同样的事情。

答案 7 :(得分:3)

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

答案 8 :(得分:2)

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

例如handle -p

我喜欢这种方法,因为你正在使用微软自己的实用程序。

答案 9 :(得分:2)

OpenedFilesView中,在“选项”菜单下,有一个名为“显示网络文件”的菜单项。也许启用后,上述实用程序有一些用处。