这是很难回答的,因为还有你没有指定你的应用程序中的许多细节,但我认为这两个Guffa的和阿米尔的答案仍然是部分正确:
- 一个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对数据本身的长度(或结束标记)进行编码的答案可能是最好的。
来源
2013-03-12 05:07:37
BTJ
我不认为这是一个有效的问题...固件是多么的大小以适应您的数据必须符合指定的内部存储区域区。如果您没有这个大小,那么您需要提供给您或在通过抽象或API使用该文件之前知道的大小。您也可以在内存映射文件中创建一个标头,以指示长度和当前偏移量(如果需要)。例如,如果您的文件大小小于页面大小,并且我在写入大小后写入该区域.. – Jay 2013-03-12 13:31:44