2009-05-25 75 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);