3

ac# .net(4.5) コマンド ライン アプリケーションを作成しました。このアプリケーションは何もしませんが、開いたままにします:

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

エクスプローラーでこのファイルに移動すると、プログラムの実行中に F2 で名前を変更できます。

削除しようとすると、次のメッセージが表示されます。 ここに画像の説明を入力

ロードされたアセンブリを削除できないことは理解できます。ロードされたアセンブリをあるフォルダーから別のフォルダーに移動しても機能しません。

しかし、なぜ名前を変更できるのでしょうか。

これは意図したものですか?既存の/読み込まれたアセンブリの名前を変更するユースケースはありますか?

4

3 に答える 3

10

ファイルは、ファイル システム内で 2 つの主要な構造によって表されます。1 つ目はディレクトリ エントリで、ファイルに関するメタデータを格納します。ファイル名、サイズ、属性、タイムスタンプなど。次は、ファイル データを格納するクラスターのチェーンです。

アセンブリを読み込むと、メモリ マップト ファイルがアセンブリ用に作成されます。最適化により、実際に使用するアセンブリの部品に対してのみ支払うことが保証されます。ファイル データは、実際に必要になるまで RAM に読み込まれません。Windows などのデマンド ページ仮想メモリ オペレーティング システムのコア機能。

メモリ マップド ファイルは、ファイルデータが別のプロセスによって変更されないように、ファイルにロックを設定します。RAM 内のデータがファイル内のデータと一致しなくなると、悲惨なことになります。Windows のロックはファイルデータのみを保護し、ファイルのメタデータは保護しません。つまり、ファイル データを変更しない限り、ファイルのディレクトリ エントリを変更できます。

したがって、ファイルの名前を変更しても問題はありません。ディレクトリ エントリが変更されるだけです。あるディレクトリから別のディレクトリにファイルを移動しても問題はありません。ディレクトリ エントリの場所が変更されるだけで、ファイルがクラスタを必要とするのに十分な大きさである限り、ファイル データは変更されません。あるドライブから別のドライブにファイルを移動すると、元のファイル データも削除するコピーが必要になるため、問題が発生します。ファイルを削除することはできません。ファイル データも削除されます。

于 2013-02-08T15:16:03.340 に答える
1

https://superuser.com/questions/488127/why-can-i-rename-a-running-executable-but-not-delete-itからのこれまでの Imo ベストアンサー

ファイルの名前を変更するようなものは実際にはありません。ファイルには複数の名前を付けたり、名前を付けなかったりできるため、名前を変更するのはファイルではなく、ディレクトリ エントリです。名前の変更はディレクトリ エントリに対する操作であり、ファイルが実行のためにロックされているという事実の影響を受けません。

于 2013-02-08T15:16:20.923 に答える
0

名前を変更しても、ディスクに書き込まれる内容はあまり変わりません。実際には、ファイル アロケーション テーブルと一部のファイル メタのみが変更される可能性があります。

このため、プログラムを含むディスクのチャンクは、名前が変更されてもメモリにコピーしたり実行したりできます。

于 2013-02-08T13:58:39.087 に答える