2009-04-28 22 views
2

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

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

有没有人知道幕后发生了什么? Windows会允许正在运行的进程的文件名(或其依赖的DLL)被改变,这似乎是反常的。我在这里错过了什么?

回答

1

只要文件仍然存在,Windows仍然可以读取它 - 这是重要的底层文件,而不是它的名称。

我可以愉快地重命名在我的XP机器上运行的可执行文件。

2

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

0

操作系统保持.exe文件的打开句柄。重命名该文件只会改变文件的一些文件系统元数据,而不会使打开的句柄失效。所以当操作系统转到更多代码页时,它只是使用它已经打开的文件句柄。

更换文件(改写它的内容)是另一回事完全和我猜的OS与FILE_SHARE_WRITE标志未设置打开,因此没有其他进程可以写入.exe文件。

0

可能是一个愚蠢的问题,但是,为什么用户有权访问重命名文件,如果他们不想重命名该文件?但是,是的,这是允许的,因为正如好的答案指出的那样,在应用程序退出之前,文件的打开句柄不会丢失。并且还有一些用途,尽管我不确定通过重命名其文件更新应用程序是一种很好的做法。

0

您可能会考虑让您的服务监听您的服务所在目录的更改。如果它检测到重命名,则可以将其重命名为它应该是的。

0

有两个方面文件这里的概念:

  1. 数据在磁盘上 - 这是实际的文件。

  2. 文件名(可以是几个或没有)您可以给这些数据 - 称为目录条目。

什么要重命名为目录条目,仍引用相同数据。 Windows并不关心你这么做,因为它仍然可以在需要时访问数据。正在运行的进程映射到数据,而不是名称。