Geo*_*-it 3 c# directory file memory-mapped-files
我有一些方法可以使用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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的路径看起来像这样:
"C:\\Users\\MyUser\\Documents\\Visual Studio 2012.mmf"
Run Code Online (Sandbox Code Playgroud)
我正在使用
Path.Combine
Run Code Online (Sandbox Code Playgroud)
例外情况发生在第一个'使用'行.如果我尝试使用相同的文件路径创建文件
File.Create
Run Code Online (Sandbox Code Playgroud)
正在创建文件没有问题.
如果有人有任何建议,那就太好了.
问候
您需要确保mapName参数(即调用中的第三个参数CreateFromFile)与文件路径不同.PathNotFound如果你这样做会引发异常.我同意,并没有真正帮助弄清楚它失败的原因.
因此,您可以选择地图名称值:
Guid.NewGuid().ToString()最后一个选项的示例:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1296 次 |
| 最近记录: |