这很难回答,因为您的应用程序仍有许多细节您没有指定,但我认为 Guffa 和 Amer 的答案仍然部分正确:
- MemoryMappedFile 比文件内存大;它是内存中 4Kb 页面的序列。所以,stream.Length 实际上会给你所有的字节(没有“内部缓冲区大小”),但它可能会给你比你预期的更多的字节,因为大小总是四舍五入到 4Kb 边界。李>
- “文件”语义来自将 MemoryMappedFile 与真实文件系统文件相关联。假设创建文件的进程总是调整文件大小,那么您可以通过文件系统获得文件的精确大小。
如果以上所有内容都适合您的应用程序,那么以下内容应该可以工作:
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 在数据本身中编码长度(或结束标记)的答案可能是最好的。