3

我创建了 ac# .net(4.5) 命令行应用程序。此应用程序什么都不做,但保持打开状态:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("started");
        Console.ReadLine();
    }
}

如果我在资源管理器中导航到这个文件,我可以在程序运行时用 F2 重命名它。

如果我尝试删除它,则会显示一条消息: 在此处输入图像描述

我可以理解,无法删除已加载的程序集。将加载的程序集从一个文件夹移动到另一个文件夹也不起作用。

但是为什么可以改名呢?

这是故意的吗?是否有重命名现有/加载的程序集的用例?

4

3 回答 3

10

文件在文件系统中由两种主要结构表示。首先是目录条目,它存储有关文件的元数据。就像文件名、大小、属性和时间戳一样。接下来是存储文件数据的集群链。

加载程序集会导致为程序集创建内存映射文件。一种优化,它确保您只需为实际使用的组件部分付费。文件数据在实际需要之前不会被读入 RAM。Windows 等按需分页虚拟内存操作系统的核心功能。

内存映射文件对文件进行锁定,以确保文件数据不能被其他进程更改。那将是灾难性的,RAM 中的数据将不再与文件中的数据匹配。Windows 中的锁只保护文件数据,而不是文件的元数据。或者换句话说,您仍然可以修改文件的目录条目,只要这不会同时修改文件数据。

所以重命名文件不是问题,只会修改目录条目。即使将文件从一个目录移动到另一个目录也没有问题,这只会更改目录条目的位置,只要文件足够大以需要集群,它就不会修改文件数据。将文件从一个驱动器移动到另一个驱动器是一个问题,因为这需要一个同时删除原始文件数据的副本。无法删除文件,这也会删除文件数据。

于 2013-02-08T15:16:03.340 回答
1

到目前为止,Imo 的最佳答案来自https://superuser.com/questions/488127/why-can-i-rename-a-running-executable-but-not-delete-it

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

于 2013-02-08T15:16:20.923 回答
0

重命名对于写入磁盘的内容并没有太大的改变,实际上它可能只会改变文件分配表和一些文件元数据。

出于这个原因,包含该程序的磁盘块仍然可以复制到内存或执行,尽管名称发生了变化。

于 2013-02-08T13:58:39.087 回答