V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
edis0n0
V2EX  ›  Windows

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

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

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

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

    @acess #10 svchost 是比较著名的会多个服务一起用的情况,所有复用型进程外 COM 服务器都有这个问题。COM Surrogate 是把进程内服务器变成进程外服务器,属于做隔离的不同维度。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5950 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:12 · PVG 10:12 · LAX 18:12 · JFK 21:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.