1

次のコードでは、ファイルを読み取り、ストリームを開いたままにします。

    static void Main(string[] args)
    {
        FileStream fileStream = new FileStream(@"C:\temp\test1.txt", FileMode.Open);
        Console.ReadLine();
    }

このファイルの名前を変更しようとすると、「ファイルは使用中です」というメッセージが表示されます。 使用中のファイル

ファイルが使用されている場合でも、ファイルの名前変更は (OS レベルで) 可能であるように見えます

.net によってストリームにロードされたファイルの名前を変更できないのはなぜですか?

4

2 に答える 2

2

アセンブリについては、.NET はそのようなものを使用してアセンブリを開く必要がありFileShare.ReadWriteます。それがドメインに読み込まれている場合でも、他のプロセスはファイル全体を書き込んだり、名前を変更したりできます。

私の知る限り、.NETにはFileShareファイル共有の名前変更を許可または禁止するための管理された列挙値( のようなものFileShare.Rename)がありませんが、Win32には必要があるため、アセンブリの読み込みは次のようなマスクでファイルストリームを作成しますFileShare.ReadWrite | FileShare.RenameFileShare.Delete名前の変更だけでなく、全体の削除も含みます)ファイル...)。

これを実証するために、次のコードを試しました。

    FileStream a = File.Open(@"C:\blah.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    a.Dispose();

ファイル ストリームが開かれ、破棄されるまで、ファイル全体を削除することはできませんでしたが、名前を変更することはできました。

アセンブリは必要なときに にロードされることに注意してください。つまり、アセンブリがAppDomainまだロードされていないため、アセンブリを作成、削除、または名前変更できる可能性があります。

に既にロードされているアセンブリを削除しようとしAppDomainます: できません (私は今試しましたが、テスト コードはコンソール アプリで実行され、実行中に実行可能ファイルを削除できませんでした)。名前を変更してみてください。動作します。

概要

ファイルがどのように開かれるか、ファイル ストリームが開かれたときにどのファイル マスク構成が使用されたかがすべてです

次のようにコードを変更すると、ファイル全体の名前を変更できます (ファイルを削除することもできます!)。

    FileStream fileStream = File.Open(@"C:\temp\test1.txt", FileMode.Open, FileShare.ReadWrite | FileShare.Delete);
    Console.ReadLine();
于 2013-02-08T16:09:03.613 に答える