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

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


最近做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); //转换为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();
}
}
}
文件头的对应建议用XML等文件存放 调用时读取XML 这儿我懒了下见谅

猜你喜欢

转载自blog.csdn.net/qxyywy/article/details/7293698