2013-08-31 132 views
3

我有幾個方法可以與MemoryMappedFiles一起使用來寫入/讀取數據。如果我使用簡單字符串作爲文件名,例如「file.mmf」,它們可以正常工作。但是,如果我使用完整的目錄路徑,上述異常正在拋出 - Exception has been thrown by the target of an invocation. 有內部異常 - {"Could not find a part of the path."}。這裏是我的方法是如何的樣子:MemoryMappedFiles無法找到路徑的一部分

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 

第一「使用」行中出現的異常。如果我嘗試創建使用相同的文件路徑的文件與

File.Create 

文件正在被使用沒有問題的產生。

如果有人有任何建議,那就太好了。

問候

回答

4

你需要確保的是,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); 
    } 
} 
+0

嗯,起初我MAPNAME只是文件名(不帶路徑),這也不能工作。但是使用GUID會使這件事情起作用。謝謝你幫助我。 –

+0

@ Georgi-it如果從文件名中刪除擴展名並將其用作映射名,它將起作用(當然,它需要您的文件名具有擴展名)。 – Alex

+0

是否記錄了mapname必須與文件路徑不同的任何地方?在任何地方? – antlersoft

相關問題