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()andreader对象mmf,但是using将确保在抛出异常时清理它<do stuff>

于 2011-06-26T00:56:48.450 回答
3

在删除文件之前,您必须处理映射:

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