windows - 在 Windows 上重命名正在运行的进程的文件镜像

标签 windows service process filenames

我在 Vista SP1 上有一个 Windows 服务应用程序,我发现用户正在重命名其可执行文件(当它运行时),然后重新启动,从而导致它无法在下次启动时启动,因为服务管理器无法再启动找到已重命名的 exe 文件。

我似乎记得在旧版本的 Windows 中您无法执行此操作,因为操作系统对文件设置了锁定。即使使用 Vista SP1,我仍然无法在运行时复制现有文件 - Windows 报告该文件正在使用 - 这是有道理的。那么为什么我应该被允许重命名它呢?如果 Windows 需要从 exe 调入新的代码页,但该文件自启动以来已被重命名,会发生什么情况?我在重命名 exe 文件等时运行了 Process Monitor,但 Process Mon 没有报告任何奇怪的情况,只是像其他文件一样记录了文件名的更改。

有谁知道幕后发生了什么吗? Windows 允许更改正在运行的进程的文件名(或其依赖的 DLL),这似乎违反直觉。我在这里缺少什么?

最佳答案

你的概念是错误的......文件名不是文件io宇宙的中心......打开文件的句柄是。当您重命名该文件时,该文件不会移动到磁盘的不同部分,它仍然位于同一位置,并且打开文件的内部数据结构的磁盘部分仍然指向同一位置。底线是你的观察是正确的。您可以重命名正在运行的程序而不会引起问题。重命名后,您可以创建一个与正在运行的程序同名的新文件。如果您想在软件运行时更新软件,这实际上是有用的行为。

关于windows - 在 Windows 上重命名正在运行的进程的文件镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/799656/

相关文章:

windows - 用于 Windows 的 git-slave

Java 程序无法在 Vista 32 位上运行

windows - 如何从 .PDB 文件创建 .MAP 文件

grails - 如何使用 Grails 服务层实现多态行为

python - 如何分离从 Pycharm 运行的 python 脚本,以便它不断附加到文件?

windows - 错误的解释器 : Permission denied error when running Ruby from Git Bash

java - 为什么net.exe start <servicename>服务启动时报错?

android - FileObserver 不工作 android 4.4.3

c - 有人能解释一下这在 C/UNIX 中的作用吗

c++ - 如何查找给定应用程序是否为单实例?