这很难回答,因为您的应用程序仍有许多细节没有具体说明,但我认为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);
}
}
但是,如果您按照上述步骤进行操作,您可能会直接使用文件并避免内存映射。 如果将其映射到文件系统不可接受,则Guffa的答案是在数据本身中编码长度(或结束标记)。