首页 > 解决方案 > 我可以在文件上“映射”或定义记录吗?

问题描述

在过去的 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#。

标签: c#.netbuffer

解决方案


在 .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);
            }
        }
    }

推荐阅读