2009-12-29 64 views
8

我需要一種能告訴我文件是圖像,音頻還是視頻文件的方法。我可以用C#做​​這個嗎?檢查文件是否是C#中的媒體文件

+1

澄清的要點 - 你想知道它是否屬於任何類別(「是媒體文件」),或者它屬於哪個類別(「是圖像/音頻/視頻」 )? – GalacticCowboy 2009-12-29 16:59:51

+0

它並沒有真正有所作爲。 – SLaks 2009-12-29 20:15:43

+0

@SLaks:正確的,它幾乎只是語義,但解決方案需要比僅僅一組擴展稍微更智能。它必須將該擴展映射到更高層次的含義。 – GalacticCowboy 2010-01-05 18:14:16

回答

26

這取決於您希望它有多強大。

做到這一點最簡單的方法是檢查擴展,像這樣:

static string[] mediaExtensions = { 
    ".PNG", ".JPG", ".JPEG", ".BMP", ".GIF", //etc 
    ".WAV", ".MID", ".MIDI", ".WMA", ".MP3", ".OGG", ".RMA", //etc 
    ".AVI", ".MP4", ".DIVX", ".WMV", //etc 
}; 

static bool IsMediaFile(string path) { 
    return -1 != Array.IndexOf(mediaExtensions, Path.GetExtension(path).ToUpperInvariant()); 
} 

編輯:對於那些誰真的想LINQ,那就是:

return mediaExtensions.Contains(Path.GetExtension(path), StringComparer.OrdinalIgnoreCase); 

注意文件的擴展名不是其內容的可靠指標;任何人都可以重命名文件並更改其擴展名。

如果您沒有擴展名,或者您不信任擴展名,您可以閱讀該文件的開頭,並查看它是否與常見媒體格式的文件簽名匹配。

+0

爲什麼這會降低投票率? – SLaks 2009-12-29 16:28:53

+0

也許人們不喜歡字符串數組?或者你可以使用Contains?我upvoted .. – 2009-12-29 16:32:23

+0

'數組'沒有'Contains'方法。 (除了通過LINQ) – SLaks 2009-12-29 16:36:24

0

您可以隨時檢查文件擴展名。

+0

爲什麼這是低調?這是一個完全可以接受的答案,儘管它缺少代碼示例。 – Thomas 2016-08-10 15:59:49

+0

@Thomas:評分的說這是一個邊緣案例,這似乎是有效的:「任何答案都可以讓提問者朝着正確的方向前進是有幫助的,但是試圖在答案中提到任何限制,假設或簡化。簡潔是可以接受的,但更全面的解釋是更好的。'https://stackoverflow.com/help/how-to-answer – Stefan 2017-10-18 10:34:41

8

方法1:最簡單 - 文件名解析。如果文件名與媒體文件類型的已知列表相匹配(即,jpg gif wmv avi mp4等),則它匹配視頻,音頻或圖像文件。這並不健壯,因爲我可以輕鬆地命名帶有.avi或.jpg擴展名的文本文件,但這並不一定是媒體文件。

方法2:更難 - 解析文件頭。例如,在CodeProject上有一個C# RIFF Parser或這個CodeProject上的文章Extracting IPTC header information from JPEG images

你最終將不得不使用這兩種方法的組合。你所要求的大部分內容已經內置到了.NET框架中。

+0

方法2的另一個問題是,你必須有一個解析器爲每個文件類型和其他文件類型將不會被識別,直到你實現他們的解析器... – GalacticCowboy 2009-12-29 16:57:48

+0

@GC:是的,正確 – 2009-12-29 17:08:22

2

是的,你可以,但除非你使用一個組件來做到這一點,你需要編寫代碼至少加載這些文件的頭文件,以檢查它們是否沒有損壞。如果文件以可靠的方式存儲,您可以只檢查其文件擴展名

foreach(string file in Directory.GetFiles("c:\\MyDir\\") 
{ 
    if(file.EndsWith("jpg", false, null)) 
     //treat as image file 
    else if(file.EndsWith("avi", false, null)) 
     //treats as avi video 
    //and so on 
} 
+0

我認爲它應該是一個很好的做法,解釋爲什麼投票。如果期望的是簡單的天真執行,答案非常簡單。但是如果有人改變了你的文件的擴展名並且弄亂了他們的名字呢?你相信聖誕老人的爪子嗎? – Andres 2009-12-29 16:30:59

+2

我沒有downvote。但對於初學者來說,並不是每一個擴展名都會是小寫字母,並且想象這種巨大的if語句必須捕捉所有媒體類型。 – 2009-12-29 16:33:52

+0

好吧,這就是爲什麼EndsWith有第二個參數來說明忽略字符大小寫。現在我認爲別人的答案也應該下降,因爲他們與我的意思相似 – Andres 2009-12-29 16:39:05

相關問題