• C# 判断文件流类型


    public static class VerifyFileExtensionName
        {
            private static IDictionary<string, string> dics = new Dictionary<string, string>();
    
            static VerifyFileExtensionName()
            {
                dics.Add("FFD8FFE0", ".jpg");
                dics.Add("89504E47", ".png");
                dics.Add("47494638", ".gif");
                dics.Add("49492A00", ".tif");
                dics.Add("424D", ".bmp");
    
                //PS和CAD
                dics.Add("38425053", ".psd");
                dics.Add("41433130", ".dwg"); // CAD
                dics.Add("252150532D41646F6265", ".ps");
    
                //办公文档类
                dics.Add("D0CF11E0", ".doc"); //ppt、doc、xls
                dics.Add("504B0304", ".docx");//pptx、docx、xlsx    
    
                /**注意由于文本文档录入内容过多,则读取文件头时较为多变-START**/
                dics.Add("0D0A0D0A", ".txt");//txt
                dics.Add("0D0A2D2D", ".txt");//txt
                dics.Add("0D0AB4B4", ".txt");//txt        
                dics.Add("B4B4BDA8", ".txt");//文件头部为汉字
                dics.Add("73646673", ".txt");//txt,文件头部为英文字母
                dics.Add("32323232", ".txt");//txt,文件头部内容为数字
                dics.Add("0D0A09B4", ".txt");//txt,文件头部内容为数字
                dics.Add("3132330D", ".txt");//txt,文件头部内容为数字      
                /**注意由于文本文档录入内容过多,则读取文件头时较为多变-END**/
    
    
                dics.Add("7B5C727466", ".rtf"); // 日记本
    
                dics.Add("255044462D312E", ".pdf");
    
                //视频或音频类
                dics.Add("3026B275", ".wma");
                dics.Add("57415645", ".wav");
                dics.Add("41564920", ".avi");
                dics.Add("4D546864", ".mid");
                dics.Add("2E524D46", ".rm");
                dics.Add("000001BA", ".mpg");
                dics.Add("000001B3", ".mpg");
                dics.Add("6D6F6F76", ".mov");
                dics.Add("3026B2758E66CF11", ".asf");
    
                //压缩包
                dics.Add("52617221", ".rar");
                dics.Add("1F8B08", ".gz");
    
                //程序文件
                dics.Add("3C3F786D6C", ".xml");
                dics.Add("68746D6C3E", ".html");
                dics.Add("7061636B", ".java");
                dics.Add("3C254020", ".jsp");
                dics.Add("4D5A9000", ".exe");
    
    
                dics.Add("44656C69766572792D646174653A", ".eml"); // 邮件
                dics.Add("5374616E64617264204A", ".mdb");//Access数据库文件
    
                dics.Add("46726F6D", ".mht");
                dics.Add("4D494D45", ".mhtml");
            }
    
            public static string GetFileType(Stream stream)
            {
                byte[] b = new byte[4];
                if (stream != null)
                {
                    try
                    {
                        stream.Read(b, 0, b.Length);
    
                        string fileType = System.Text.Encoding.UTF8.GetString(b);
    
                        DGHR.Util.Logger.Debug("文件类型:" + fileType);
                    }
                    catch (IOException e)
                    {
                        DGHR.Util.Logger.Error(e);
                        return string.Empty;
                    }
                }
    
                string fileKey = GetFileHeader(b);
    
                if (dics.ContainsKey(fileKey))
                    return dics[fileKey];
                else
                {
                    DGHR.Util.Logger.Info("未找到当前流的扩展名");
                    return string.Empty;
                }
            }
    
    
            /**
             * 根据文件转换成的字节数组获取文件头信息
             * 
             * @param filePath
             *            文件路径
             * @return 文件头信息
             */
            private static string GetFileHeader(byte[] b)
            {
                string value = BytesToHexString(b);
                return value;
            }
    
            /**
             * 将要读取文件头信息的文件的byte数组转换成string类型表示
             * 下面这段代码就是用来对文件类型作验证的方法, 
             * 将字节数组的前四位转换成16进制字符串,并且转换的时候,要先和0xFF做一次与运算。
             * 这是因为,整个文件流的字节数组中,有很多是负数,进行了与运算后,可以将前面的符号位都去掉,
             * 这样转换成的16进制字符串最多保留两位,如果是正数又小于10,那么转换后只有一位,
             * 需要在前面补0,这样做的目的是方便比较,取完前四位这个循环就可以终止了
             * @param src要读取文件头信息的文件的byte数组
             * @return 文件头信息
             */
            private static string BytesToHexString(byte[] src)
            {
                StringBuilder builder = new StringBuilder();
                if (src == null || src.Length <= 0)
                {
                    return null;
                }
                string hv;
                for (int i = 0; i < src.Length; i++)
                {
                    // 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写
                    hv = Convert.ToString(src[i] & 0xFF, 16).ToUpper();
                    if (hv.Length < 2)
                    {
                        builder.Append(0);
                    }
                    builder.Append(hv);
                }
    
                DGHR.Util.Logger.Info("转换到为:" + builder.ToString());
    
                return builder.ToString();
            }
        }
  • 相关阅读:
    【剑指offer】24.反转链表
    【剑指offer】22. 链表中倒数第k个节点
    【每日一题-leetcode】84.柱状图中最大的矩形
    activity切换动画
    取消ActionBar的方法
    软工概论学习一
    软工概论学习二
    屏幕滑动监测以及触发事件
    Android 动画解释
    shape 学习
  • 原文地址:https://www.cnblogs.com/zhaogaojian/p/13277636.html
Copyright © 2020-2023  润新知