2011-06-04 113 views
8

我有一個簡單的WCF服務,可以讓客戶/消費者上傳圖片,音頻或視頻文件。上傳完畢後,服務應該分析該文件並以某種方式檢索以下屬性:獲取特定的文件屬性

圖片:寬度,高度,拍攝日期,程序使用

音頻:運行時,藝術家,專輯,流派,比特率,出版年份

視頻:運行時,寬度,高度,幀/秒,視頻比特率,音頻比特率

顯然,Windows可以獲取並很容易地顯示這些屬性,但我怎麼做它在C#中?

+2

[Read/Write'Extended'file properties(C#)](http://stackoverflow.com/questions/220097/read-write-extended-file-properties-c) – AxelEckenberger 2013-01-09 12:59:47

回答

7

Courtesty的this thread.

我已經驗證了這一點得到所有文件屬性,包括擴展屬性。

在你的項目中去「添加引用」 - > COM - >「微軟殼牌控制和自動化」

補充一點,再次禮貌說線程,一個C#方法來讀取文件的屬性中一個目錄。 (我還在研究,看看是否有可能在一個特定的文件執行此功能。如果沒有,你總是可以通過文件名中的問題,並確認只得到屬性了該文件。)

public static void Main(string[] args) 
{ 
    List<string> arrHeaders = new List<string>(); 

    Shell32.Shell shell = new Shell32.Shell(); 
    Shell32.Folder objFolder; 

    objFolder = shell.NameSpace(@"C:\temp\testprop"); 

    for(int i = 0; i < short.MaxValue; i++) 
    { 
     string header = objFolder.GetDetailsOf(null, i); 
     if (String.IsNullOrEmpty(header)) 
      break; 
     arrHeaders.Add(header); 
    } 

    foreach(Shell32.FolderItem2 item in objFolder.Items()) 
    { 
     for (int i = 0; i < arrHeaders.Count; i++) 
     { 
      Console.WriteLine("{0}\t{1}: {2}", i, arrHeaders[i], objFolder.GetDetailsOf(item, i)); 
     } 
    } 
} 
+1

請注意,此解決方案在Windows XP上不起作用。當從XP訪問Shell32時,您會遇到COM異常。 – 2012-10-15 11:26:55

+1

爲了我的知識/經驗,這對XP很好。你看到什麼問題? – Khepri 2012-10-15 14:52:45

2

獲取這些信息的最簡單方法是讓(Explorer)Shell爲你做,並只需要詢問(通過Windows Property System)。而從C#中完成的最簡單的方法可能是使用Windows API Code Pack for .NET

具體而言,您將要訪問Property Store。要獲得入門幫助,請查看PropertiesEditDemo項目的Samples文件夾。

您可以通過讀取文件的所有元數據來自己做,但問題是您的程序必須知道所有可用文件類型的所有可用元數據。我通常更喜歡掛在殼牌上的知識。