5

次のコードは、この例外をスローします。

「別のプロセスで使用されているため、プロセスはファイル '\filename' にアクセスできません。」

十分ですが、ファイルを削除できるようにリーダーや mmf を閉じる適切な方法は何ですか? MemoryMappedFile には close() メソッドなどがあると思いますが、そうではありません。

どんな助けでも大歓迎です。ありがとう。

mmf = MemoryMappedFile.CreateFromFile(filename,
      System.IO.FileMode.OpenOrCreate,
      "myMap" + fileNo.ToString(),
      fileSize);

reader = mmf.CreateViewAccessor(0, accessorSize);

<do stuff>

File.Delete(filename);

編集:

私がこの問題を抱えているのはデストラクタだけのようです。dispose() が他の場所で呼び出されると正常に動作しますが、次のようにすると例外がスローされます。Reader と mmf は明らかにクラスのメンバーです。コンストラクターに入ると、ファイルアクセスに暗黙的な何かが起こっていますか?

~Class()
{
    try
    {
        if (File.Exists(filename))
        {
            reader.Dispose();
            mmf.Dispose();
            File.Delete(filename);
        }
    }
    catch (Exception e)
    {
    }
}
4

2 に答える 2

4

using可能であれば、構成を利用する必要があります。

using (var mmf = MemoryMappedFile.CreateFromFile(filename,
                   System.IO.FileMode.OpenOrCreate,
                   "myMap" + fileNo.ToString(), fileSize))
{
    using (reader = mmf.CreateViewAccessor(0, accessorSize))
    {  
       ... <do stuff> ...
    }
}

File.Delete(filename);

Dispose()それ以外の場合は、readerandmmfオブジェクトを呼び出しますが、using例外がスローされた場合に備えて、確実にクリーンアップされ<do stuff>ます。

于 2011-06-26T00:56:48.450 に答える
3

ファイルを削除する前に、マッピングを破棄する必要があります。

reader.Dispose();
mmf.Dispose();
File.Delete(filename);
于 2011-06-26T00:30:57.193 に答える