Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';无法删除MemoryMappedFile的文件_C#_File_Memory Mapped Files - Fatal编程技术网

C# Can';无法删除MemoryMappedFile的文件

C# Can';无法删除MemoryMappedFile的文件,c#,file,memory-mapped-files,C#,File,Memory Mapped Files,以下代码引发此异常: “进程无法访问文件'\filename',因为另一个进程正在使用它。” 很公平,但是关闭读卡器和/或mmf以便删除文件的正确方法是什么?我认为MemoryMappedFile应该有一个close()方法或类似的方法,但它没有 任何帮助都将不胜感激。谢谢 mmf = MemoryMappedFile.CreateFromFile(filename, System.IO.FileMode.OpenOrCreate, "myMap" + fileNo.To

以下代码引发此异常:

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

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

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

如果可能,您应该使用
使用
构造:

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);
使用(var mmf=MemoryMappedFile.CreateFromFile)(文件名,
System.IO.FileMode.OpenOrCreate,
“myMap”+fileNo.ToString(),fileSize))
{
使用(reader=mmf.CreateViewAccessor(0,accessorSize))
{  
...  ...
}
}
删除(文件名);

否则,在
读取器
mmf
对象上调用
Dispose()
,但是
使用
将确保在异常被抛出时将其清除

谢谢。所以我觉得我把这个问题弄糊涂了。实际上,我已经尝试过上面的方法,但它不起作用,但是在移动东西之后,我发现它只在类析构函数中不起作用(即抛出异常)。你知道为什么它在析构函数中不起作用,但在代码的其他地方起作用吗?我收回这一点。它在析构函数以外的地方遇到问题。您不应该尝试在终结器中处理(或访问)其他对象,因为该对象可能已被GCD。但析构函数的目的不是在对象超出范围之前清理它们吗?但它认为这是没有意义的,因为我在代码的其他地方也遇到了这个问题。终结器的作用是清理非托管资源;reader和mmf是托管对象。事实上,终结器(.net没有析构函数)是一个单独的问题,我只是想指出它。我真希望MS没有使用C++中的终结器的C++析构函数语法,这样会避免一些错误,人们认为它是C++析构函数。
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);