gpt4 book ai didi

c# - 在 C# 中处理内存映射文件的正确方法

转载 作者:行者123 更新时间:2023-11-30 21:55:21 29 4
gpt4 key购买 nike

我有以下测试代码:

const string filePath = @"c:\tests\mmap.bin";
const long k64 = 64 * 1024;

// create mmap file and accessor, then adquire pointer
var fileStream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
fileStream.SetLength(k64);

var mmap = MemoryMappedFile.CreateFromFile(fileStream, null, fileStream.Length,
MemoryMappedFileAccess.ReadWrite,
null, HandleInheritability.None, true);

var accessor = mmap.CreateViewAccessor(0, 0, MemoryMappedFileAccess.ReadWrite);
byte* pointer = null;
accessor.SafeMemoryMappedViewHandle.AcquirePointer(ref pointer);


// dispose accessor, mmap file and stream
accessor.SafeMemoryMappedViewHandle.Close();
accessor.Dispose();
mmap.SafeMemoryMappedFileHandle.Close();
mmap.Dispose();
fileStream.Dispose();

// This causes UnauthorizedAccessException:
// Access to the path 'c:\tests\mmap.bin' is denied
File.Delete(filePath);

它创建或打开 c:\tests\mmap.bin,将其长度设置为 64Kb,对其进行内存映射,然后尝试释放所有资源。但并非所有资源都被释放,File.Delete(filePath) 失败。

释放内存映射文件持有的所有资源的正确方法是什么?

最佳答案

之后

accessor.SafeMemoryMappedViewHandle.AcquirePointer(ref pointer);

你需要打电话

accessor.SafeMemoryMappedViewHandle.ReleasePointer();

用于清理。

关于c# - 在 C# 中处理内存映射文件的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32371525/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com