为什么有的时候 windows 删除被占用的文件报错时能给出对应的进程名,有的时候只说“被另一程序占用”?

2022-11-02 22:49:57 +08:00
 edis0n0
2239 次点击
所在节点    Windows
14 条回复
acess
2022-11-03 02:00:10 +08:00
当系统提示文件被占用时,为何不顺便告诉用户文件被什么进程占用呢? - 知乎用户的回答 - 知乎
https://www.zhihu.com/question/31614421/answer/52718104
acess
2022-11-03 02:08:09 +08:00
另外其实不需要 process explorer 等工具,其实系统自带的资源监视器里就能查句柄。
acess
2022-11-03 02:29:10 +08:00
知乎答案里提到的“示例代码”,其实是 oldnewthing 博客里的一篇。不过看着感觉奇怪,因为 oldnewthing 博客文章里说没有追踪所以查不到,但知乎答案里却说“NT/2000 时代起就可以用 NtQuerySystemInformation 查到系统打开的所有句柄及其对应的 PID”(相当于 lsof 吧?)
acess
2022-11-03 02:32:49 +08:00
其实说到 oldnewthing 我有点想起 youtube 上 NCommander 讲的三维弹球的故事(虽然我是在 B 站看的汉化搬运),其实背后并不像 oldnewthing 里说的那么简单。
geelaw
2022-11-03 03:42:58 +08:00
@acess #1 复制一下我刚写的评论:

答案自然是因为 COM 。文件的所有权不一定“来自”打开它的进程,或许是进程 A 用进程外 COM 服务器 B 打开了文件 C ,此时提示是 B 占用 C 是技术上正确,但对于普通用户无意义 /误导的信息,甚至可能鼓励自以为是的用户干掉进程 B 。例如一些文件在 svchost 里打开,但解决方法是关掉另一个程序。
Building
2022-11-03 09:09:39 +08:00
A 让 B 使用 C 打开文件 D ,请问文件 D 应该被哪个进程占用?
tgich
2022-11-03 10:02:41 +08:00
今天最新的 power toy 也支持查看被占用的应用
xiaochen3
2022-11-03 12:01:48 +08:00
@tgich 具体是哪个功能里支持了,我去试试~
ysc3839
2022-11-03 12:35:09 +08:00
@geelaw 其实有些情况下可能是 bug 导致无法显示,比如删除某个进程的当前目录 (current directory) 时就不会显示是哪个进程。
acess
2022-11-03 13:36:29 +08:00
@geelaw 但我觉得有时候用户也未必在乎要不要 graceful shutdown ,结束进程就是很粗暴的动作。

svchost 这个听起来好像影响可能扩大到很严重,但反过来我也在想如果真是这样那是不是应该尽量避免影响扩大呢?我记得 oldnewthing 博客里也说过 com surrogate 就是 explorer 的替死鬼。
acess
2022-11-03 13:38:14 +08:00
再扯远点,我记得像 chkdsk 也有强制卸除卷的选项,这也是在其他程序没有主动配合的情况下强行进行的,“会让已打开的句柄无效”
wanguorui123
2022-11-03 13:41:21 +08:00
IObit Unlocker 可以查看占用和解锁
tgich
2022-11-03 14:27:03 +08:00
geelaw
2022-11-04 02:55:23 +08:00
@ysc3839 #9 单纯是因为没有 IFileInUse 罢了,属于设计问题。

@acess #10 svchost 是比较著名的会多个服务一起用的情况,所有复用型进程外 COM 服务器都有这个问题。COM Surrogate 是把进程内服务器变成进程外服务器,属于做隔离的不同维度。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/892228

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX