如何獲取檔案字尾名(無後綴名或字尾名被修改--非常規需求)
阿新 • • 發佈:2018-12-27
這是之前就寫了的 只不過放在了百度裡 沒有轉過來 現在轉過來
最近做SOCKET通訊傳輸檔案遇到獲取檔案真實型別,即字尾名的問題
我要傳輸檔名到客服端,上傳檔案時若是遇到無後綴名或是字尾名被更改的如何獲取其型別(字尾名)
在C#中獲取檔案字尾名可以Path.GetExtension(filePath);filePath傳入為檔案的物理路徑這樣可以很方便的獲取到檔案的字尾名,但有問題的是若是我把字尾名刪除或是更改掉的話檔案如何獲知起型別,即字尾名
通過網上尋求幫助鎖定為檔案頭 查詢相關資料寫了一個操作類
檔案頭的對應建議用XML等檔案存放 呼叫時讀取XML 這兒我懶了下見諒public class FileTypeDetector { protected static Dictionary<String, String> head2FileType = new Dictionary<String, String>(); static FileTypeDetector() { head2FileType.Add("FFD8FFE1", "jpg"); head2FileType.Add("89504E47", "png"); head2FileType.Add("47494638", "gif"); head2FileType.Add("49492A00", "tif"); head2FileType.Add("424D", "bmp"); head2FileType.Add("41433130", "dwg"); head2FileType.Add("38425053", "psd"); head2FileType.Add("7B5C727466", "rtf"); head2FileType.Add("3C3F786D6C", "xml"); head2FileType.Add("68746D6C3E", "html"); head2FileType.Add("44656C69766572792D646174", "eml"); head2FileType.Add("CFAD12FEC5FD746F ", "dbx"); head2FileType.Add("2142444E", "pst"); head2FileType.Add("D0CF11E0", "xls/doc"); head2FileType.Add("5374616E64617264204A", "mdb"); head2FileType.Add("FF575043", "wpd"); head2FileType.Add("252150532D41646F6265", "eps/ps"); head2FileType.Add("255044462D312E", "pdf"); head2FileType.Add("E3828596", "pwl"); head2FileType.Add("504B0304", "zip"); head2FileType.Add("52617221", "rar"); head2FileType.Add("57415645", "wav"); head2FileType.Add("41564920", "avi"); head2FileType.Add("2E7261FD", "ram"); head2FileType.Add("2E524D46", "rm"); head2FileType.Add("000001BA", "mpg"); head2FileType.Add("000001B3", "mpg"); head2FileType.Add("6D6F6F76", "mov"); head2FileType.Add("3026B2758E66CF11", "asf"); head2FileType.Add("4D546864", "mid"); } private static String BytesToHexString(String fileName) { StringBuilder stringBuilder = new StringBuilder(); using (FileStream fis = new FileStream(fileName, FileMode.OpenOrCreate)) { try { byte[] b = new byte[4]; fis.Read(b, 0, b.Length); for (int i = 0; i < b.Length; i++) { int v = b[i] & 0xFF; String hv = Convert.ToString(v, 16); //轉換為16進位制 if (hv.Length < 2) { stringBuilder.Append(0); } stringBuilder.Append(hv); } } catch { //未進行異常日誌記錄 throw new IOException(); } finally { if (fis != null) fis.Close(); } } return stringBuilder.ToString().ToUpper(); } /// <summary> /// 獲取檔案型別(預設為*.*) /// </summary> /// <param name="fileName"></param> /// <returns></returns> public String FileType(String fileName) { try { String head = BytesToHexString(fileName); return head2FileType[head]; } catch { return "*.*"; //未進行異常日誌記錄 //throw new IOException(); } } }