检测子流

时间:2012-03-10 22:58:53

标签: .net excel filestream

“MS-XLS文件格式包含流,子流和记录。” - Understanding the Excel MS-XLS Binary Format

给定xls文件流:

FileStream stream = System.IO.File.Open(filePath, FileMode.Open, FileAccess.Read);
var xs = new List<int>();
for(int i = 0; i < stream.Length;i++)
{
 xs.Add(stream.ReadByte());
}

我如何检测子流?该名称是否具有欺骗性,因为子流实际上是以某种顺序包含在流中的?

2 个答案:

答案 0 :(得分:1)

XLS(以及Office 2007之前的其他MS Office格式)是结构化存储文件,也就是复合二进制文件(请参阅https://en.wikipedia.org/wiki/COM_Structured_Storage)。结构化存储就像文件内部的文件系统,其中文件称为“流”,目录称为“存储”。结构化存储文件具有单个根“存储”,可以包含流和其他存储,并且它似乎是xls文件中所有流所在的位置(这可能是他们的文档跳过“存储”概念并引用的原因)流作为“子流”)。

通常,您将使用IStorage界面访问结构化存储(请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/aa380015%28v=vs.85%29.aspx),但这可能不是.NET中最方便的方法。

为了访问.NET中结构化存储中的数据,我建议使用OpenMCDF - http://sourceforge.net/projects/openmcdf/ - 但我自己没有尝试过,所以我不能对其质量作出任何承诺。

“记录”不是结构化存储文件格式的一部分,我认为您需要自己解析它们。

根据您要做的事情,使用更高级别的界面而不是担心XLS格式的细节可能是合适的。

答案 1 :(得分:0)

“OLE复合文件:一种结构化存储形式,如[MS-CFB]中所述。复合文件允许独立存储和流存在于单个文件中。” -MS

基本上,此流反映了用于存储文件的结构,术语“子流”至少应该在MSDN库中定义。

所有文件都可以表示为从流中读取的字节数组,并且构造流非常常见。在.NET中,文件流用于收集此数据,并可用于任何文件,如.xls,.jpg,.doc等。