あなたが指定していないアプリケーションの詳細がまだたくさんあるので、これに答えるのは難しいですが、Guffa と Amer の両方の答えはまだ部分的に正しいと思います:
- MemoryMappedFile は、ファイルよりも多くのメモリです。これは、メモリ内の 4Kb ページのシーケンスです。したがって、stream.Length は実際にはすべてのバイトを提供します (「内部バッファー サイズ」はありません) が、サイズは常に 4Kb 境界に切り上げられるため、予想よりも多くのバイトが提供される可能性があります。
- 「ファイル」セマンティックは、MemoryMappedFile を実際のファイルシステム ファイルに関連付けることに由来します。ファイルを作成するプロセスが常にファイル サイズを調整すると仮定すると、fileSystem を介してファイルの正確なサイズを取得できます。
上記のすべてがアプリケーションに適合する場合、次のように動作するはずです。
static byte[] ReadMemoryMappedFile(string fileName)
{
long length = new FileInfo(fileName).Length;
using (var stream = File.Open(fileName, FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite))
{
using (var mmf = MemoryMappedFile.CreateFromFile(stream, null, length, MemoryMappedFileAccess.Read, null, HandleInheritability.Inheritable, false))
{
using (var viewStream = mmf.CreateViewStream(0, length, MemoryMappedFileAccess.Read))
{
using (BinaryReader binReader = new BinaryReader(viewStream))
{
var result = binReader.ReadBytes((int)length);
return result;
}
}
}
}
}
データを書き込むには、これを使用できます。
private static void WriteData(string fileName, byte[] data)
{
using (var stream = File.Open(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
{
using (var mmf = MemoryMappedFile.CreateFromFile(stream, null, data.Length, MemoryMappedFileAccess.ReadWrite, null, HandleInheritability.Inheritable, true))
{
using (var view = mmf.CreateViewAccessor())
{
view.WriteArray(0, data, 0, data.Length);
}
}
stream.SetLength(data.Length); // Make sure the file is the correct length, in case the data got smaller.
}
}
ただし、上記のすべてを実行するまでには、ファイルを直接使用してメモリ マッピングを回避することもできます。ファイルシステムへのマッピングが受け入れられない場合は、データ自体の長さ (または終了マーカー) をエンコードする Guffa の回答がおそらく最適です。