3

データの書き込み/読み取りのために MemoryMappedFiles で動作するいくつかのメソッドがあります。ファイル名に「file.mmf」などの単純な文字列を使用すると、問題なく動作します。ただし、完全なディレクトリ パスを使用すると、上記の例外がスローされます - Exception has been thrown by the target of an invocation. With internal exception - {"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

ファイルは問題なく作成されています。

誰かに何か提案があれば、それは素晴らしいことです。

よろしく

4

1 に答える 1

5

mapName引数 (つまり、 への呼び出しの 3 番目の引数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);
    }
}
于 2013-08-31T21:11:01.023 に答える