C#BinaryReader - 可能是也可能不是二进制文件

时间:2016-01-08 12:53:39

标签: c# binaryfiles descriptor binaryreader

我使用二进制文件存储某些产品的测量数据。该产品是之前唯一的一种,现在我必须能够保存/加载更多类型的产品。

我要在文件的开头保存一些类型描述符,1个字节应该是绝对足够的,将来只有几种类型(2,可能是3或4)。

问题是,我仍然需要能够在没有此描述符的情况下加载旧的二进制文件。这是我的旧代码和评论,我想检查描述符的存在,然后做出关于这样的产品类型的决定:

  1. 没有描述符 - >旧产品
  2. Descriptor = xxx - >新产品xxx
  3. 是否可以以这种格式保存描述符?我想调用reader.PeekChar()只是一种可能性,因为没有移动到下一个字节,但我不确定在这种情况下如何使用它。

         BinaryReader reader;
         using (reader = new BinaryReader(File.Open(header.path, FileMode.Open, FileAccess.Read)))
         {
             // ...
             // check presence of product type descriptor
             // make a decision of type
             // ...
    
             DateTime measTime = DateTime.FromOADate(reader.ReadDouble());
             double diameter = reader.ReadDouble();
             double plusToler = reader.ReadDouble();
             double minusToler = reader.ReadDouble();
         }
    

1 个答案:

答案 0 :(得分:1)

如果我理解correclty的问题是你不知道你是在读取类型描述符(新文件)还是第一个数据值(旧文件)。

解决此问题的一种简单方法是为新文件选择不同的文件扩展名 - 但根据您的情况,这可能不是一种选择。

如果没有,您可以在产品描述符前添加一个魔术值,该值不会(或不太可能)出现在旧文件格式中。像ASCII字符"TYP"一样简单,后跟产品描述符字节的东西不太可能以旧文件格式出现(以double值开头)。

您甚至可以选择序列化double.MinValue作为您的神奇值,因为DateTime.FromOADate只能读取

  

介于负值657435.0到正数2958465.99999999之间的值

这将完全排除错误地将旧文件识别为新文件。