一切都在标题中,但更正式的是:
为什么 Windows 允许我重命名正在运行的可执行文件,但不允许删除它?
答案1
实际上,没有重命名文件这种事。一个文件可以有多个名称,也可以没有名称,因此您重命名的不是文件,而是目录条目。重命名是对目录条目的操作,不受文件被锁定执行的影响。
答案2
它不允许删除可执行文件和 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
答案3
我猜是因为名称只是文件相同二进制内容的一个属性,所以只要数据存在,正在运行的进程持有的句柄就不会改变。