2009-05-25 69 views
1

如何检查单词模板文件。可以使用扩展名.dot或.dotx进行检查。 但是,如果用户将.txt更改为.dot。它如何识别?检查单词模板文件

+0

您需要澄清的问题。您是否在问如何使用C#通过查看文件来确定文件是否是单词模板? – 2009-05-25 06:10:02

+0

是汤普森先生。我需要它使用C#编码。 – Sauron 2009-05-25 06:11:38

回答

1

要检查DOTX文件(这实际上是一个压缩文件),检查标头:

0000000: 504b 0304 1400 0000 0800 95a1 3435 4a07 PK..........45J. 

前四个字节被量0x050 0x4b 0x03时0×04。这将演示一个文件是否为zip文件(因此不一定是dotx),如果您想进一步检查是否需要解压缩整个缓冲区并解析生成的XML。

要检查点文件(前2007年),检查标题:

0000000: d0cf 11e0 a1b1 1ae1 0000 0000 0000 0000 ................ 

前八个字节0xd0 0xcf为0x11 0xe0的0xa1 0xb1 0X1A 0xe1

所以对于这两种情况下,打开文件以二进制模式读取前八个字节并进行比较。

+1

使用整个签名是有意义的,其中4个字节用于拉链,8个用于点。 – 2009-05-25 09:25:41

0

检查文件签名,.DOT文件应与D0 CF开始.....

+1

你能否扩大你的答案。 – Sauron 2009-05-25 06:12:18

0

一个.DOTX文件只是一个ZIP文件,所以你可以检查它是否以“PK”(拉链头开始),那么您需要完全解压缩文件并检查内容是否是有效的Word模板。

+0

你可以给它一些代码吗? – Sauron 2009-05-25 06:15:55

1

根据http://www.garykessler.net/library/file_sigs.html,点文件(等等)的完整签名是:

D0 CF 11 E0 A1 B1 1A E1

所以,下面是一些代码开始。它适用于.dot,但如果你想检查.dotx,你可以实现类似的代码。这并不能保证它是一个有效的点,所以你仍然需要在以后合理地处理错误。

// Use this as a class field. 
private static readonly byte[] DOT_SIGNATURE = new byte[]{0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1}; 

后来,当你真正拥有的流:

bool isDot = true; 

Stream dotStream = ... 
byte[] firstBytes = new byte[DOT_SIGNATURE.Length]; 
int totalRead = 0, curRead; 

while(totalRead < DOT_SIGNATURE.Length) 
{ 
    curRead = dotStream.Read(firstBytes, totalRead, DOT_SIGNATURE.Length - totalRead); 
    if(curRead == 0) 
    { 
      isDot = false;     
      break; // Premature end of stream; 
    } 

    totalRead += curRead; 
} 

if(isDot) 
{ 
    for(int i = 0; isDot && i < DOT_SIGNATURE.Length; i++) 
    { 
      // If isDot becomes false, arrays are not equal and we break out. 
      isDot = (firstBytes[i] == DOT_SIGNATURE[i]); 
    } 
} 

dotStream.Seek(0, SeekOrigin.Begin);