MemoryMappedFiles找不到路径的一部分
本文关键字:一部分 路径 找不到 MemoryMappedFiles | 更新日期: 2023-09-27 18:29:49
我有一些方法可以使用MemoryMappedFiles写入/读取数据。如果我使用简单的字符串作为文件名,例如"file.mmf",它们可以正常工作。但是,如果我使用完整的目录路径,则会引发上述异常-Exception has been thrown by the target of an invocation.
内部异常-{"Could not find a part of the path."}
。以下是我的方法:
public void WriteToFile(string fileName, string value)
{
string newFileName = CombineDirectory(fileName);
byte[] newValue = Encoding.UTF8.GetBytes(value);
long capacity = newValue.Length + INT_MAXVALUE_TO_BYTEARRAY_LENGTH;
using (var mmf = MemoryMappedFile.CreateFromFile(newFileName, FileMode.Create, newFileName, capacity))
{
using (var accesor = mmf.CreateViewAccessor())
{
byte[] newValueLength = BitConverter.GetBytes(value.Length);
accesor.WriteArray(0, newValueLength, 0, newValueLength.Length);
accesor.WriteArray(INT_MAXVALUE_TO_BYTEARRAY_LENGTH, newValue, 0, newValue.Length);
}
}
}
我的路径如下:
"C:''Users''MyUser''Documents''Visual Studio 2012.mmf"
我正在使用
Path.Combine
异常发生在第一行"using"上。如果我尝试使用的相同文件路径创建一个文件
File.Create
正在创建文件,没有任何问题。
如果有人有什么建议,那就太好了。
问候
您需要确保mapName
参数(即对CreateFromFile
的调用中的第三个参数)与文件路径不相同。如果你这样做,它会抛出一个PathNotFound
异常。我同意,这对弄清楚它失败的原因没有太大帮助。
因此,您选择地图名称值的选项:
- 生成一些唯一密钥,例如
Guid.NewGuid().ToString()
- 使用常数值,例如"MySpecialMapForThings"
- 使用一些约定,例如生成一个唯一密钥,该密钥也仅用于映射文件的文件名部分
最后一个选项的示例:
public static Tuple<FileInfo, string> GenerateMapInfo(string mapDirectory, string fileExtension)
{
var uniqueMapName = Guid.NewGuid().ToString();
var fileName = Path.Combine(mapDirectory, Path.ChangeExtension(uniqueMapName, fileExtension));
return Tuple.Create(new FileInfo(fileName), uniqueMapName);
}
public void WriteToFile(Tuple<FileInfo, string> mapInfo, string value)
{
byte[] newValue = Encoding.UTF8.GetBytes(value);
long capacity = newValue.Length + INT_MAXVALUE_TO_BYTEARRAY_LENGTH;
using (var mmf = MemoryMappedFile.CreateFromFile(mapInfo.Item1.FullName, FileMode.Create, mapInfo.Item2, capacity))
using (var accesor = mmf.CreateViewAccessor())
{
byte[] newValueLength = BitConverter.GetBytes(value.Length);
accesor.WriteArray(0, newValueLength, 0, newValueLength.Length);
accesor.WriteArray(INT_MAXVALUE_TO_BYTEARRAY_LENGTH, newValue, 0, newValue.Length);
}
}