为什么我可以重命名正在运行的可执行文件,但不能删除它?

mar*_*set 13 windows-7 rename

一切都在标题中,但更正式的是:

为什么 Windows 允许我重命名正在运行的可执行文件,而不是删除它?

Dav*_*rtz 12

真的没有重命名文件这样的事情。一个文件可以有多个名称或没有名称,因此您要重命名的不是文件而是目录条目。重命名是对目录项的操作,不受文件被锁定执行的影响。

  • @Serge:因为打开文件的进程通过设置适当的打开标志专门要求它失败。 (6认同)
  • 最有可能的是,将 `dwShareMode` 设置为零或使用 `OF_SHARE_COMPAT` 或 `OF_SHARE_EXCLUSIVE` 标志。 (3认同)
  • 嗯,为什么任何尝试重命名为读取或写入而打开的常规文件都会失败? (2认同)

Ser*_*rge 7

它不允许删除可执行文件和 DLL,因为 Windows 将可执行文件的一部分映射到内存中作为进程创建的一部分,因此它在进程的生命周期内需要该文件。

不幸的是,我没有真正的理由为什么它仍然允许重命名此类文件。我想这样做是为了在运行时启用 dll 和 exe 文件的更新,以最大限度地减少服务中断时间。

相比之下,linux(一般为 unix)允许在运行时删除可执行文件:

tmp]$ cp /usr/bin/md5sum .;ll md5*; \
(./md5sum /home/pub/iso/FC5/FC-5-i386-DVD.iso & ); \
rm md5sum ; ll md5*;ps -f
-rwxr-xr-x 1 sergey sergey 37276 Oct 16 02:38 md5sum
ls: cannot access md5*: No such file or directory
UID        PID  PPID  C STIME TTY          TIME CMD
sergey    2423  2422  0 02:32 pts/1    00:00:00 -bash
sergey    2533     1  0 02:38 pts/1    00:00:00 ./md5sum /home/pub/iso/FC5/FC-5-
sergey    2536  2423  0 02:38 pts/1    00:00:00 ps -f
Run Code Online (Sandbox Code Playgroud)

  • @ChrisInEdmonton 是的,但我在这里解释了这一点:http://unix.stackexchange.com/questions/49299/what-is-linux-doing-differently-that-allows-me-to-remove-replace-files-where-赢 (2认同)