无法删除MemoryMappedFile的文件

时间:2011-06-26 00:28:08

标签: c# file memory-mapped-files

以下代码抛出此异常:

“进程无法访问文件'\ 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)
    {
    }
}

2 个答案:

答案 0 :(得分: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()reader对象上调用mmf,但using将确保在<do stuff>中抛出异常时将其清除}。

答案 1 :(得分:3)

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

reader.Dispose();
mmf.Dispose();
File.Delete(filename);