gpt4 book ai didi

c# - MemoryMappedFiles 找不到路径的一部分

转载 作者:行者123 更新时间:2023-11-30 14:58:36 24 4
gpt4 key购买 nike

我有一些方法可以使用 MemoryMappedFiles 来写入/读取数据。如果我使用简单的字符串作为文件名,它们就可以正常工作,例如“file.mmf”。但是,如果我使用完整目录路径,则会抛出上述异常 -调用的目标抛出了异常。内部异常 - {"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 异常。我同意,这对弄清楚它失败的原因并没有多大帮助。

因此您选择 map 名称值的选项:

  • 生成一些唯一的 key ,例如Guid.NewGuid().ToString()
  • 使用常量值,例如"MySpecialMapForThings"
  • 使用一些约定,例如生成一个唯一的 key ,您也可以将其仅用于映射文件的文件名部分。

最后一个选项的示例:

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);
}
}

关于c# - MemoryMappedFiles 找不到路径的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18552165/

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