c# - 我可以在文件上“映射”或定义记录吗?
问题描述
在过去的 DEC/HP VMS Vax Basic 中,有一种方法可以定义记录的字段并将该定义“映射”到打开的文件。读取记录时,映射中定义的字段会为该记录填充,而无需对解析和设置进行编码。它曾经看起来像这样:
MAP (Bec) STRING Owner = 30%, LONG Vehicle_number, &
STRING Serial_number = 22%
OPEN "VEH.IDN" FOR INPUT AS FILE #2%, &
ORGANIZATION SEQUENTIAL FIXED, &
MAP Bec, ACCESS READ
INPUT "Which record do you want";A%
WHILE (A% <> 0%)
GET #2%, RECORD A%
PRINT "The vehicle number is", Vehicle_number
PRINT "The serial number is", Serial_number
PRINT "The owner of vehicle";Vehicle_number; "is", Owner
INPUT "Next Record";A%
NEXT
CLOSE #2%
END
我找不到 .Net 环境中是否有类似的东西,特别是 C#。
解决方案
在 .Net Framework 中有一个 MemoryMappedFile 类,请参见
https://docs.microsoft.com/en-us/dotnet/api/system.io.memorymappedfiles.memorymappedfile
您可以使用它来创建内存映射文件,并且有一些方法可以将结构读取和写入内存区域。
请参阅链接中的示例:
long offset = 0x10000000; // 256 megabytes
long length = 0x20000000; // 512 megabytes
// Create the memory-mapped file.
using (var mmf = MemoryMappedFile.CreateFromFile(@"c:\ExtremelyLargeImage.data", FileMode.Open,"ImgA"))
{
// Create a random access view, from the 256th megabyte (the offset)
// to the 768th megabyte (the offset plus length).
using (var accessor = mmf.CreateViewAccessor(offset, length))
{
int colorSize = Marshal.SizeOf(typeof(MyColor));
MyColor color;
// Make changes to the view.
for (long i = 0; i < length; i += colorSize)
{
accessor.Read(i, out color);
color.Brighten(10);
accessor.Write(i, ref color);
}
}
}
推荐阅读
- python - 同一图中的重尾分布和正态分布
- mysql - mySQL - 如果备用数据在列中,如何求和
- angular - 禁用角度 ng-select 窗口
- javascript - Angular 6 - 无法在画布上动态添加文本
- objective-c - 时区休息一小时
- php - Joomla 开始和语言重定向
- angular - Angular 无法编译 Typescript 的映射类型修饰符
- php - Symfony 困境:通用实体,特定方法
- javascript - 使用酶完整安装找到的组件的实例等于 null
- java - 使用 ByteBuddy 代理的 Hibernate 中的 MethodHandler 陷入无限循环