创建MemoryMappedFile时路径访问被拒问题求助
内存映射文件创建时的权限拒绝问题解决
问题场景
创建MemoryMappedFile时,已配置MemoryMappedFileSecurity并以管理员模式运行,但仍抛出**"Access to the path is denied"**错误。
原始代码
var security = new MemoryMappedFileSecurity(); security.SetAccessRule(new AccessRule<MemoryMappedFileRights>(new SecurityIdentifier(WellKnownSidType.WorldSid, null), MemoryMappedFileRights.FullControl, AccessControlType.Allow)); MemoryMappedFile memoryMappedFile = MemoryMappedFile.CreateFromFile( new FileStream(path, FileMode.Open, FileAccess.Write, FileShare.ReadWrite), "MMFName", 100000000, MemoryMappedFileAccess.ReadWrite, security, HandleInheritability.None, false );
报错堆栈跟踪
at System.IO.MemoryMappedFiles.MemoryMappedFile.CreateCore(SafeFileHandle fileHandle, String mapName, HandleInheritability inheritability, MemoryMappedFileSecurity memoryMappedFileSecurity, MemoryMappedFileAccess access, MemoryMappedFileOptions options, Int64 capacity) at System.IO.MemoryMappedFiles.MemoryMappedFile.CreateFromFile(FileStream fileStream, String mapName, Int64 capacity, MemoryMappedFileAccess access, MemoryMappedFileSecurity memoryMappedFileSecurity, HandleInheritability inheritability, Boolean leaveOpen)
解决方案
以下是几个针对性的排查和修复方向:
修正FileStream的访问权限
内存映射文件的MemoryMappedFileAccess.ReadWrite要求底层FileStream至少拥有ReadWrite权限,当前代码中FileStream用了FileAccess.Write,权限不匹配。修改为:new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)避免内存映射文件名称冲突
全局名称"MMFName"可能已被系统中其他进程占用,导致权限冲突。改用唯一名称:string uniqueMapName = $"MMF_{Process.GetCurrentProcess().Id}_{Guid.NewGuid()}";检查底层文件的NTFS权限
即使配置了MMF的安全规则,目标文件本身的NTFS权限可能限制了访问。右键文件→属性→安全,确认当前管理员账户拥有读取和写入权限。调整LeaveOpen参数并手动管理流生命周期
leaveOpen: false会自动关闭FileStream,可能引发文件锁定问题。改用leaveOpen: true,并通过using语句手动管理资源:using (var fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)) { var security = new MemoryMappedFileSecurity(); security.SetAccessRule(new AccessRule<MemoryMappedFileRights>(new SecurityIdentifier(WellKnownSidType.WorldSid, null), MemoryMappedFileRights.FullControl, AccessControlType.Allow)); using (var mmf = MemoryMappedFile.CreateFromFile( fs, "MMFName", 100000000, MemoryMappedFileAccess.ReadWrite, security, HandleInheritability.None, true )) { // 执行MMF相关操作 } }
内容的提问来源于stack exchange,提问作者vin
相关产品推荐
相关产品推荐

