您如何找到在 Windows 中打开文件的进程?

cle*_*tus 588 windows file-sharing

关于 Windows,让我无休止地烦恼的一件事是旧的共享冲突错误。通常你无法确定是什么让它打开了。通常它只是一个指向相关目录的编辑器或资源管理器,但有时我不得不重新启动我的机器。

关于如何找到罪魁祸首的任何建议?

Edd*_*die 491

我在Sysinternals Process Explorer 上取得了成功。有了这个,您可以搜索以查找哪个进程打开了文件,如果需要,您可以使用它来关闭句柄。当然,全程关闭更安全。保持谨慎和判断力。

要查找特定文件,请使用菜单选项Find->Find Handle or DLL... 键入文件路径的一部分。进程列表将出现在下面。

如果你更喜欢命令行,Sysinternals 套件包括命令行工具Handle,它列出了打开的句柄。

例子

  • c:\Program Files\SysinternalsSuite>handle.exe |findstr /i "e:\"(查找从驱动器打开的所有文件e:\
  • c:\Program Files\SysinternalsSuite>handle.exe |findstr /i "file-or-path-in-question"

  • 您可以关闭手柄,但请记住,您正在从应用程序下方拉出地毯,结果充其量是不可预测的。 (21认同)
  • 对于资源管理器,顺便说一句,按住 ctrl-shift 并右键单击开始菜单的空白区域,您将获得“退出资源管理器”-ps,这不是杰夫的回答。 (14认同)
  • @Walden:当然。天啊。使用 WinXP,我多次让资源管理器无缘无故地打开一个句柄并拒绝关闭它。当这种情况发生在您需要删除的文件上时,您可以选择强制关闭句柄或重新启动。到目前为止,已经做了几十次,我没有受到任何不良影响。与任何高级工具一样,请谨慎使用和判断。 (13认同)
  • 关闭句柄可能会导致应用程序在另一个文件上重新使用句柄,从而导致损坏 - 请参阅下面杰夫的回答:http://serverfault.com/a/15695/79266 ...杀死保存文件的应用程序要安全得多打开,如果你不想重启。 (6认同)
  • 需要注意的是,ProcessExplorer 必须以管理员身份运行,否则它可能无法看到系统进程打开的文件。 (4认同)
  • 它对非执行文件 ig 文本文件没有帮助。我需要知道谁在写入日志文件。任何的想法? (2认同)
  • 确保这适用于文本文件。它不关心打开什么类型的文件。 (2认同)

Svi*_*ish 253

为此,您可以使用Windows 7、8 和 10内置资源监视器

  1. 打开Resource Monitor,可以找到
    • 通过在开始菜单中搜索资源监视器resmon.exe,或
    • 作为任务管理器中性能选项卡上的按钮
  2. 转到CPU选项卡
  3. 使用搜索栏相关手柄部分
    • 请参阅下面屏幕截图中的蓝色箭头

找到句柄后,您可以通过查看图像和/或 PID 列来识别进程。

然后您可以尝试像往常一样关闭应用程序,或者,如果这不可能,只需右键单击句柄并直接从那里终止进程。十分简单!

资源监视器截图

复制自我的原始答案:https : //superuser.com/a/643312/62

  • 在 Windows 10 中仍然有效,可以通过使用任务管理器 -> 性能选项卡中的“打开资源监视器”按钮找到。 (6认同)
  • @Kylotan,别再浪费时间搜索了。直接从 cmd 运行 `resmon` (5认同)
  • 值得注意的是,在 Windows 8 上很难找到这个程序 - 搜索“resmon.exe”应该可以找到它。 (2认同)

Mar*_*wul 99

关闭手柄时要非常小心;由于句柄回收,它比您想象的更危险 - 如果您关闭文件句柄,并且程序打开其他东西,那么您关闭的原始文件句柄可能会重新用于“其他东西”。现在猜猜如果程序继续运行会发生什么,认为它正在处理文件(您关闭了它的句柄),而实际上该文件句柄现在指向其他东西。

请参阅Raymond Chen关于此主题的帖子

假设搜索索引服务有一个打开的文件进行索引,但暂时卡住了,并且您想删除该文件,因此您(不明智地)强行关闭了句柄。搜索索引服务为了记录一些信息而打开它的日志文件,将被删除文件的句柄作为日志文件的句柄回收。卡住的操作终于完成了,搜索索引服务终于开始关闭它已经打开的句柄,但最终却在不知不觉中关闭了日志文件句柄。

搜索索引服务打开另一个文件,比如一个用于写入的配置文件,以便它可以更新某些持久状态。日志文件的句柄作为配置文件的句柄被回收。搜索索引服务想要记录一些信息,因此它写入其日志文件。不幸的是,日志文件句柄被关闭并且句柄重新用于其配置文件。记录的信息进入配置文件,破坏它。

同时,您强制关闭的另一个句柄被重用为互斥句柄,用于帮助防止数据损坏。当原始文件句柄关闭时,互斥句柄也将关闭,防止数据损坏的保护将丢失。服务运行的时间越长,其索引的损坏程度就越大。最终,有人注意到索引返回了不正确的结果。当您尝试重新启动该服务时,它会失败,因为其配置文件已损坏。

您将问题报告给提供搜索索引服务的公司,他们确定索引已损坏,日志文件神秘地停止记录,并且配置文件被垃圾覆盖。一些可怜的技术人员被分配了一项无望的任务,即找出服务损坏其索引和配置文件的原因,而没有意识到损坏的根源是您强行关闭了句柄。

  • 重要警告,这应该更接近顶部 - 重新启动可能比静默损坏的文件更好。 (13认同)
  • +1 这肯定会让我在强制关闭手柄时三思而后行!我觉得奇怪的是,Windows 会立即重新使用关闭句柄的编号,而不是继续增加编号并仅在必要时回绕。这至少会大大减少这个问题发生的机会。 (9认同)
  • @RichVel 终止罪魁祸首进程可能比完全重新启动要好。 (2认同)
  • 这是一个非常重要的警告,但没有回答这个问题*你如何找到在 Windows 中打开文件的进程?* (2认同)

Joh*_*uhy 96

试试openfiles命令。

  • 这看起来适用于 Windows 2012R2 64 位,但您需要通过运行 `openfiles /local on` 并重新启动来启用“打开本地跟踪”服务。这使得此功能不是很有用。 (13认同)
  • +1 表示内置命令,尽管我个人大部分时间都使用 ProcessExplorer。 (10认同)
  • 错误:目标系统必须运行 32 位操作系统。 (8认同)
  • 不适用于 64 位操作系统! (5认同)

Gre*_*ill 29

过去,我曾成功地使用Handle来找到此类进程。

  • 我一直在使用这个工具。如果我无法弹出 USB 驱动器,我只需输入“handle H:”(或任何驱动器号)。最重要的是,您可以使用它来强制关闭手柄。 (4认同)

小智 12

Lockhunter ( http://lockhunter.com/ ) 适用于 32 位和 64 位系统。


Max*_*mus 8

只是为了澄清,这更有可能是由于行为不端的第 3 方应用程序没有正确使用CreateFile API 调用而不是 Windows 本身中的任何内容。或许是CreateFile设计的结果,大功告成,回不去了。

基本上,在 Windows 程序中打开文件时,您可以选择指定允许共享访问的标志。如果您不指定标志,程序将独占访问该文件。

现在,如果资源管理器似乎是这里的罪魁祸首,那可能只是表面上的情况,真正的罪魁祸首是安装了一个 shell 扩展程序,该扩展程序出于自己的目的打开文件夹中的所有文件,但也是如此gung-ho 这样做,或者它本身没有正确清理。赛门铁克 AV 是我以前见过这样做的,如果其他 AV 程序也应该受到指责,我也不会感到惊讶。源代码控制插件也可能有问题。

所以不是真正的答案,而是一些建议,不要总是将可能编写得很糟糕的 3rd 方程序归咎于 Windows(这也可能发生在任何其他具有隐式文件锁定的操作系统上,但任何基于 Unix 的操作系统都具有共享访问权限)默认)。

  • 我不会责怪第 3 方应用程序,因为我的 Windows 资源管理器始终将 Thumbs.db 文件锁定在其工作目录中,但当我切换工作目录时并不总是解锁它。至少当我关闭窗口时它们会解锁,我不必杀死所有探险家...... (2认同)

Gen*_*ror 7

谁锁定我运作良好,让人们对这个名字感到有趣!


K. *_*ley 6

在远程服务器上,当您检查网络共享时,像计算机管理控制台这样简单的东西可以显示此信息并关闭文件。


小智 6

Apropos Explorer 将文件保持打开状态:“当您需要删除的文件发生这种情况时,您可以选择强制关闭句柄或重新启动。”

你可以结束资源管理器。

如果这是一次性的事情(资源管理器通常不会打开此文件),那么我猜想注销并重新登录就可以了。

否则,杀死桌面资源管理器进程并在它消失后做你想做的事情。首先启动 cmd.exe 的副本(您需要一个 UI 来执行您想要的清理工作)。确保没有非桌面资源管理器正在运行。然后使用例如任务管理器杀死最后一个资源管理器。在命令提示符中执行您想要的操作。最后,从命令提示符运行资源管理器,它将成为桌面。

如果某些系统托盘程序无法处理 shell 重新启动,我猜可能会有一些残留的不愉快。


Dir*_*ler 5

文件可以被本地进程(unlocker是使用的工具)和通过共享进入的文件访问锁定。

Windows 中有一个内置功能,可以显示本地计算机上的哪些文件被远程计算机打开/锁定(通过文件共享打开文件):

* Select "Manage Computer" (Open "Computer Management")
* click "Shared Folders"
* choose "Open Files"
Run Code Online (Sandbox Code Playgroud)

在那里你甚至可以强行关闭文件。