2010-05-27 49 views
5

我有這些將被調用的Siebel遺留應用程序的文件流發送一個C#組件會收到以下類型 .DOC,.PDF,.xls的一個文件,.RTF通過查找其二進制內容以編程方式查找文件類型。可能?

所以......

[LegacyApp] >> {二進制文件流} >> [成分]

繼承應用程序是一個黑盒子是不能被修改,以告知組件是什麼文件類型( doc,pdf,xls)。組件需要讀取這個二進制流,並使用正確的擴展名在文件系統上創建一個文件。

任何想法?

謝謝你的時間。

回答

7

在基於Linux/Unix系統,你可以使用文件的命令,但我相信你想在代碼中手工做自己......

如果你有機會到是文件的字節流,那麼你需要獨立處理每個文件類型。

大多數做你想知道的程序/組件通常會讀取前幾個字節並根據它進行分類。例如,GIF文件以下列之一開始:GIF87a或GIF89a

許多文件格式在文件開始時具有相同的簽名,或者具有相同的頭文件格式。此簽名被稱爲magic number as described by me on this post

一個好的開始就是去www.wotsit.org。它包含可按文件類型搜索的文件格式規範。您可以查看要處理的重要文件類型,並查看是否可以在這些文件格式中找到某些識別因素。

您也可以搜索Google來嘗試找到執行此分類的庫,或查看文件命令的源代碼。

+0

謝謝。將研究這 – user20358 2010-05-27 14:01:23

+0

如果你想在代碼中處理,是的,你唯一的選擇是看字節,並找出什麼文件類型是基於此。大多數文件在描述數據,格式等的前幾個字節中都有某種標題。 – Justin 2010-05-27 15:50:07

0

在linux上,有一個命令叫做file。給定一個任意文件,它試圖確定它是什麼類型的文件。例如:

gzip compressed data, from Unix, last modified: Fri Jun 12 20:16:28 2009 
HTML document text 
vCalendar calendar file 
RCS/CVS diff output text 

這些來自我的主目錄周圍的一些隨機文件。

+0

我正在使用將部署在Windows環境中的.net組件。 – user20358 2010-05-27 14:00:58

0

是的。見file

請不要重新發明輪子。它的工作原理很好。

+2

當然這個特殊的輪子在Linux下工作。不是用c#定位的通用平臺。 – Jens 2010-05-27 13:50:38

+0

@Jens - 實際上它是跨平臺的。不是用C#定位的平臺。 – amphetamachine 2010-05-27 13:51:46

+0

謝謝Jens,我正在尋找類似於我提到的每種類型的文件簽名。 – user20358 2010-05-27 14:00:22

1

你在這可能感興趣的是:http://en.wikipedia.org/wiki/Magic_number_(programming)

大多數二進制格式包含在他們開始一個神奇的數字。如果您只需識別一組特定的格式,應該很容易檢查新傳入文件的前幾個字節,並正確猜測適當的文件擴展名。

+0

謝謝,但所有MS Office文件(doc,xls,rtf)中的幻數似乎相同。我需要區分這些。 – user20358 2010-05-28 08:57:08

1

是的,這是可能的,因爲MS Office(97-2007或其附近)文件全部以D0CF11E開頭,然後在字節512處有一個子類型標記。

用於這些基準是: http://www.garykessler.net/library/file_sigs.html

這似乎是最好的名單各地,以各種文件格式 - 這是維基百科的主要參考依據。

它並沒有提供新的Office格式的完整細節,所以這是來自我自己的例子。 DOCX文件以「PK」開頭(技術上它們是zip文件),然後包含字符串「word/_rels/document.xml.rels」,而XLSX包含「xl/_rels/workbook.xml.rels」。