C# Can';无法删除MemoryMappedFile的文件
以下代码引发此异常: “进程无法访问文件'\filename',因为另一个进程正在使用它。” 很公平,但是关闭读卡器和/或mmf以便删除文件的正确方法是什么?我认为MemoryMappedFile应该有一个close()方法或类似的方法,但它没有 任何帮助都将不胜感激。谢谢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
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);