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

c# 基础 专栏收录该内容
19 篇文章 1 订阅

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


最近做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 这儿我懒了下见谅
  • 1
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值