2013-08-31 15 views
3

데이터 쓰기/읽기를 위해 MemoryMappedFiles와 함께 작동하는 몇 가지 방법이 있습니다. "file.mmf"와 같이 파일 이름에 간단한 문자열을 사용하면 제대로 작동합니다. 그러나 전체 디렉토리 경로를 사용하면 위에서 언급 한 예외가 throw됩니다. - Exception has been thrown by the target of an invocation. 내부 예외가있는 경우 - {"Could not find a part of the path."}.MemoryMappedFiles 경로의 일부를 찾을 수 없습니다.

"C:\\Users\\MyUser\\Documents\\Visual Studio 2012.mmf" 

그리고 예외는 '사용'첫 번째 줄에 발생

Path.Combine 

을 사용하고 있습니다 :

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

내 경로는 다음과 같습니다 : 여기 내 방법은 같은 모습입니다.

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

음, 처음에 내 맵 이름 중 하나가 작동하지 않았다 (경로)없이 파일 이름 만했다. 그러나 GUID를 사용하면이 기능이 작동합니다. 도와 주셔서 감사합니다. –

+0

@ Georgi-it 파일 이름에서 확장자를 제거하고 그것을 mapname으로 사용하면 작동합니다 (물론 파일 이름에 확장자가 있어야합니다). – Alex

+0

mapname이 파일 경로와 구별되어야하는 곳이면 어디에 문서화되어 있습니까? 전혀? – antlersoft

관련 문제