2010-05-27 175 views
4

如何檢測文件是二進制還是純文本?檢測文件是二進制還是純文本?

基本上我的.NET應用程序正在處理批處理文件和提取數據,但我不想處理二進制文件。

作爲一種解決方案,我正在考慮分析文件的第一個X字節,如果有比打印字符更多的不可打印字符,它應該是二進制的。

這是正確的做法嗎?這項任務有沒有更好的實施?

+1

你的方法幾乎是我會做到這一點。我會掃描很多\ n的,但同樣的想法。 – 2010-05-27 17:20:47

+1

看看http:// stackoverflow。com/questions/567757/how-do-i-distinction-between-binary-and-text-files或者http://stackoverflow.com/questions/277521/how-to-identify-the-file-content-is -in-ascii-or-binary - 這些都是相同的問題,除了不專門用於.NET,我認爲大部分你想知道的已經回答了。 – schnaader 2010-05-27 17:22:34

+0

你在做什麼樣的處理? – 2010-05-27 17:22:50

回答

4

Unix file命令以一種聰明的方式執行此操作。當然,它還有更多的功能,但你可以檢查算法here,然後構建一些專門的東西。


UPDATE:上面的鏈接似乎被打破。嘗試this

+1

這是否真的適用於運行在Windows環境中的.Net應用程序? – 2010-05-27 17:47:56

+1

@Moron:是的,因爲'file'不使用OS提供的信息來確定文件類型。它只是在查看其他答案中提到的各種BOM,幻數,內容啓發式等等。 – 2010-05-27 18:10:36

+0

@Derrick:我的意思是,它是否檢測Windows機器上常見的文件,例如在Windows Vista/Windows 7上發現的文件?無論如何,只要將某人指向「文件」的源代碼並不是很有用。 – 2010-05-27 18:16:21

0

您可以對第一個X字節數進行正則表達式,如果所有字節都在正確的character class中,則可以給出有效匹配。但這可能預示着你知道編碼。

6

你是什麼意思的二進制?用中文二進制書寫的'戰爭藝術'是否給你?日英詞典怎麼樣?

沒有真正的100%的方法。

你需要使用某種啓發式。

某些選項可能是看:

如果以上(特別是文件簽名和擴展名)別幫助,然後嘗試根據某些字節的存在/不存在來猜測(就像你正在做的那樣)。

注意:最好首先檢查擴展名/簽名,因爲您只需要讀取幾個字節/文件元數據,並且與實際讀取整個文件相比,這將非常高效。

+1

這就是我問這個問題的原因:) – 2010-05-27 18:36:31

+0

雖然你需要一個簽名數據庫等,對於我的任務,元數據閱讀太多了完全在設計它。 – 2010-05-27 18:37:29

+0

@dr。邪惡。文件擴展名檢查不合理?我認爲這是文件元數據。無論如何,我想你有足夠的信息來處理你的工作:-) – 2010-05-27 19:18:05

0

我認爲這樣做的最好方法是至多從文件中取出前X個字節(X可以是256,512等),計算不被ASCII文件使用的字符數(ascii代碼允許的是:10,13,32-126)。如果你確定腳本是用英文書寫的,那麼除了所提到的字符外,不能有任何字符。如果您對語言不太確定,那麼您最多可以允許Y字符超出集合(如果X是512,我會選擇Y是8或10)。

如果這還不夠好,可以使用更多的約束條件,例如:根據文件的語法,這些關鍵字應該存在(例如:對於批處理文件,應該有一些回顯,轉到,通話,退出等)

相關問題