如何获取文件后缀名(无后缀名或后缀名被修改--非常规需求)

来源:互联网 发布:mac版的仙剑没有文字 编辑:程序博客网 时间:2024/05/16 09:49

这是之前就写了的 只不过放在了百度里 没有转过来 现在转过来


最近做SOCKET通讯传输文件遇到获取文件真实类型,即后缀名的问题

我要传输文件名到客服端,上传文件时若是遇到无后缀名或是后缀名被更改的如何获取其类型(后缀名)

在C#中获取文件后缀名可以Path.GetExtension(filePath);filePath传入为文件的物理路径这样可以很方便的获取到文件的后缀名,但有问题的是若是我把后缀名删除或是更改掉的话文件如何获知起类型,即后缀名

通过网上寻求帮助锁定为文件头 查询相关资料写了一个操作类


[csharp] view plain copy
  1. public class FileTypeDetector  
  2. {  
  3. protected static Dictionary<String, String> head2FileType = new Dictionary<String, String>();  
  4. static FileTypeDetector()  
  5. {  
  6. head2FileType.Add("FFD8FFE1""jpg");  
  7. head2FileType.Add("89504E47""png");  
  8. head2FileType.Add("47494638""gif");  
  9. head2FileType.Add("49492A00""tif");  
  10. head2FileType.Add("424D""bmp");  
  11. head2FileType.Add("41433130""dwg");  
  12. head2FileType.Add("38425053""psd");  
  13. head2FileType.Add("7B5C727466""rtf");  
  14. head2FileType.Add("3C3F786D6C""xml");  
  15. head2FileType.Add("68746D6C3E""html");  
  16. head2FileType.Add("44656C69766572792D646174""eml");  
  17. head2FileType.Add("CFAD12FEC5FD746F ""dbx");  
  18. head2FileType.Add("2142444E""pst");  
  19. head2FileType.Add("D0CF11E0""xls/doc");  
  20. head2FileType.Add("5374616E64617264204A""mdb");  
  21. head2FileType.Add("FF575043""wpd");  
  22. head2FileType.Add("252150532D41646F6265""eps/ps");  
  23. head2FileType.Add("255044462D312E""pdf");  
  24. head2FileType.Add("E3828596""pwl");  
  25. head2FileType.Add("504B0304""zip");  
  26. head2FileType.Add("52617221""rar");  
  27. head2FileType.Add("57415645""wav");  
  28. head2FileType.Add("41564920""avi");  
  29. head2FileType.Add("2E7261FD""ram");  
  30. head2FileType.Add("2E524D46""rm");  
  31. head2FileType.Add("000001BA""mpg");  
  32. head2FileType.Add("000001B3""mpg");  
  33. head2FileType.Add("6D6F6F76""mov");  
  34. head2FileType.Add("3026B2758E66CF11""asf");  
  35. head2FileType.Add("4D546864""mid");  
  36. }  
  37.   
  38. private static String BytesToHexString(String fileName)  
  39. {  
  40. StringBuilder stringBuilder = new StringBuilder();  
  41. using (FileStream fis = new FileStream(fileName, FileMode.OpenOrCreate))  
  42. {  
  43. try  
  44. {  
  45. byte[] b = new byte[4];  
  46. fis.Read(b, 0, b.Length);  
  47.   
  48. for (int i = 0; i < b.Length; i++)  
  49. {  
  50. int v = b[i] & 0xFF;  
  51. String hv = Convert.ToString(v, 16); //转换为16进制  
  52. if (hv.Length < 2)  
  53. {  
  54. stringBuilder.Append(0);  
  55. }  
  56. stringBuilder.Append(hv);  
  57. }  
  58. }  
  59. catch  
  60. {  
  61. //未进行异常日志记录  
  62. throw new IOException();  
  63. }  
  64. finally  
  65. {  
  66. if (fis != null)  
  67. fis.Close();  
  68. }  
  69. }  
  70. return stringBuilder.ToString().ToUpper();  
  71. }  
  72.   
  73. /// <summary>  
  74. /// 获取文件类型(默认为*.*)  
  75. /// </summary>  
  76. /// <param name="fileName"></param>  
  77. /// <returns></returns>  
  78. public String FileType(String fileName)  
  79. {  
  80. try  
  81. {  
  82. String head = BytesToHexString(fileName);  
  83. return head2FileType[head];  
  84. }  
  85. catch  
  86. {  
  87. return "*.*";  
  88. //未进行异常日志记录  
  89. //throw new IOException();  
  90. }  
  91. }  
  92. }  
文件头的对应建议用XML等文件存放 调用时读取XML 这儿我懒了下见谅
0 0