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

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

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

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

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

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