第一个种方式利用Win32API 读取文件头获取Mime-Type
[DllImport( @" urlmon.dll " , CharSet = CharSet.Auto)] private extern static System.UInt32 FindMimeFromData( System.UInt32 pBC, [MarshalAs(UnmanagedType.LPStr)] System.String pwzUrl, [MarshalAs(UnmanagedType.LPArray)] byte [] pBuffer, System.UInt32 cbSize, [MarshalAs(UnmanagedType.LPStr)] System.String pwzMimeProposed, System.UInt32 dwMimeFlags, out System.UInt32 ppwzMimeOut, System.UInt32 dwReserverd ); public string getMimeFromFile( string filename) { if ( ! File.Exists(filename)) throw new FileNotFoundException(filename + " not found " ); byte [] buffer = new byte [ 256 ]; using (FileStream fs = new FileStream(filename, FileMode.Open)) { if (fs.Length >= 256 ) fs.Read(buffer, 0 , 256 ); else fs.Read(buffer, 0 , ( int )fs.Length); } try { System.UInt32 mimetype; FindMimeFromData( 0 , null , buffer, 256 , null , 0 , out mimetype, 0 ); System.IntPtr mimeTypePtr = new IntPtr(mimetype); string mime = Marshal.PtrToStringUni(mimeTypePtr); Marshal.FreeCoTaskMem(mimeTypePtr); return mime; } catch (Exception e) { return " unknown/unknown " ; } }
第二种方式 利用系统注册表查找Mime-Type
using System.IO; using Microsoft.Win32; string GetMimeType(FileInfo fileInfo) { string mimeType = " application/unknown " ; RegistryKey regKey = Registry.ClassesRoot.OpenSubKey( fileInfo.Extension.ToLower() ); if (regKey != null ) { object contentType = regKey.GetValue( " Content Type " ); if (contentType != null ) mimeType = contentType.ToString(); } return mimeType; }