这是之前就写了的 只不过放在了百度里 没有转过来 现在转过来
最近做SOCKET通讯传输文件遇到获取文件真实类型,即后缀名的问题
我要传输文件名到客服端,上传文件时若是遇到无后缀名或是后缀名被更改的如何获取其类型(后缀名)
在C#中获取文件后缀名可以Path.GetExtension(filePath);filePath传入为文件的物理路径这样可以很方便的获取到文件的后缀名,但有问题的是若是我把后缀名删除或是更改掉的话文件如何获知起类型,即后缀名
通过网上寻求帮助锁定为文件头 查询相关资料写了一个操作类
- 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);
- if (hv.Length < 2)
- {
- stringBuilder.Append(0);
- }
- stringBuilder.Append(hv);
- }
- }
- catch
- {
-
- throw new IOException();
- }
- finally
- {
- if (fis != null)
- fis.Close();
- }
- }
- return stringBuilder.ToString().ToUpper();
- }
-
-
-
-
-
-
- public String FileType(String fileName)
- {
- try
- {
- String head = BytesToHexString(fileName);
- return head2FileType[head];
- }
- catch
- {
- return "*.*";
-
-
- }
- }
- }
文件头的对应建议用XML等文件存放 调用时读取XML 这儿我懒了下见谅