2010-11-14 44 views
5

我需要知道我的文件是否是音頻文件:mp3,wav等...
如何做到這一點?如何確定文件類型?

+0

什麼決定了你的文件類型,除了擴展名?並非每個文件都有指定其類型的元數據。 – 2010-11-14 14:42:14

+0

一個文件頭,它決定一個文件類型。音頻文件,視頻文件,djvu文件等... – Sergey 2010-11-14 14:43:52

+3

簡單的答案就是打開文件作爲字節流,然後讀取前20個字節。但是你應該小心,因爲簽名字節如何存儲在文件頭中沒有真正的標準。您將不得不測試所有常見情況,或者提供一些可用的恆星文檔。 – 2010-11-14 14:46:41

回答

0

您可以使用文件擴展名來弄明白:

using System.IO; 

class Program 
{ 
    static void Main() 
    { 
     string filepath = @"C:\Users\Sam\Documents\Test.txt"; 

     string extension = Path.GetExtension(filepath); 
     if (extension == ".mp3") 
     { 
      Console.WriteLine(extension); 
     } 
    } 
} 

的文件擴展名是呼叫的第一點,爲OS找出文件類型它在處理,如果你真的想知道文件類型100%是唯一的方法來讀取文件。但是,這帶來了一個問題,圖像文件很容易,因爲它們以一種非常容易閱讀的格式包含標題,但是它可以通過完全可變的文件類型變得更復雜一些。

您可以在舊帖子上查看this帖子以獲得一些幫助。 Here是一篇關於尋找媒體文件類型的文章。

最終它取決於你爲什麼試圖做到這一點。

+0

我可以根據需要更改擴展名,但我需要知道文件類型。 – Sergey 2010-11-14 14:41:36

-1
Path.GetExtension(PathToFile) 
+2

不,它會返回文件擴展名。但我需要知道文件類型 – Sergey 2010-11-14 14:39:43

0

this後。您最終將文件中的第一個(最多)256個字節的數據傳遞給FindMimeFromData(Urlmon.dll的一部分)。

2

雖然您可以使用擴展名來合理地猜測文件是什麼,但它不能保證100%的工作時間。如果你的目標是Windows,那麼它的工作時間爲99.9%,因爲這是Windows跟蹤哪種文件是什麼類型的。

如果您從非Windows來源獲取文件,唯一可行的方法是打開文件並查找明確標識它的特定字符串或字節集。例如,您可以在mp3文件中查找ID3 tags

ID3v1標記佔用128個字節,以字符串TAG開頭。

ID3v2標籤是大小可變的,通常出現在文件的開頭,以幫助流媒體。

你走多遠取決於你希望你的解決方案有多強大,並且依賴於總是存在的標題或模式。

這樣做可以幫助防範惡意內容,其中有人發佈惡意軟件作爲mp3文件(比如說),並希望它只會被一個易受某種漏洞攻擊(緩衝區溢出)的程序運行。

+0

+1,指出文件擴展名是Windows如何確定文件類型(以及它應該打開哪個應用程序)。如果此方法中斷,那麼該文件很可能會「破壞」給用戶,因爲它們無法在Windows資源管理器中打開它。 Mac OS X用於處理這個問題的方式不同,但從10.6開始,它們將文件擴展名切換到黑暗的一面,作爲用於將文件與其創建者關聯的主要元數據。 – 2010-11-14 14:57:21

+1

@Cody - 關於Mac的有趣點,我認爲他們使用了「unix」方法。 – ChrisF 2010-11-14 15:00:21

+0

實際上,與在嵌入資源分叉中嵌入類型代碼和創建者代碼之前的OS X中使用的分叉方法保持向後兼容相當複雜。在10.4版本中,Apple開始使用統一類型標識符,這是Windows世界中我們夢寐以求的東西。然而,直到10.6,如​​果一個文件存在,它仍然基於它的創建者代碼打開,但是此行爲已經被刪除,並且所有文檔(甚至那些具有舊版創建者代碼的文檔)都只使用文件擴展名。 – 2010-11-14 15:15:27

5

那麼,最健壯的方法是爲你想檢測的文件類型編寫一個解析器,然後試試 - 如果沒有錯誤,顯然是你嘗試的類型。然而,這是一種昂貴的方法,但它可以確保您可以成功加載文件,因爲它還會檢查文件的其餘部分是否具有語義完整性。

一個便宜得多的變體是查找「魔術」字節 - 在文件的開始或已知偏移量處簽名。例如,如果文件以ID3標籤開頭,則可以合理確定它是MP3文件。如果一個文件以RIFF¼↕☻ WAVEfmt開頭,那麼它是一個WAV文件。但是,這種檢測並不能保證你的文件真的是這種類型的 - 它可能只是簽名和跟蹤那些垃圾。

+0

如果他使用的lib/codec可以播放所有這些文件格式,會發生什麼情況? – 2010-11-14 14:52:32