zoukankan      html  css  js  c++  java
  • 通过文件头区分文件类型(包含常见文件的文件头)

    1、常见文件类型的文件头(使用UltraEdit文本编辑器获取):

      可执行文件(如exe、bat、dll等):4D5A

      office2003系列:504B       

      office2007系列:D0CF 

      PDF文件:2550

    2、代码:

    /// <summary>
        /// 文件类型
        /// </summary>
        public enum FileType
        {
            /// <summary>
            /// 枚举未定义的文件类型
            /// </summary>
            Undefined = -1,
            /// <summary>
            /// 可执行文件
            /// </summary>
            PEFile = 0,
            /// <summary>
            /// office2003系列文件
            /// </summary>
            Office2003 = 1,
            /// <summary>
            /// office2007和2010系列文件
            /// </summary>
            Office07And10 = 2,
            /// <summary>
            /// PDF文件
            /// </summary>
            PDFFile = 3,
            /// <summary>
            /// dwg文件
            /// </summary>
            DWGFile = 4,
            /// <summary>
            /// rar文件
            /// </summary>
            RARFile = 5,
            /// <summary>
            /// zip文件
            /// </summary>
            ZIPFile = 6,
            /// <summary>
            /// png图片
            /// </summary>
            PNGFile = 7,
            /// <summary>
            /// jpg图片
            /// </summary>
            JPGFile = 8
        }
    
        /// <summary>
        /// 文件类型检查
        /// </summary>
        public class FileTypeCheck
        {
            /// <summary>
            /// 文件类型检查
            /// </summary>
            /// <param name="filePath"></param>
            /// <returns>文件类型枚举对象</returns>
            public FileType TypeCheck(string filePath)
            {
                FileType ft;
                //获取文件头部标识,14个字符串
                string fileHead = GetFileHead(filePath);
                //获取文件的通常头部长度4,一般情况下这个长度足够判断;
                string normalHead = fileHead.Substring(0, 4);
                switch (normalHead)
                {
                    case "4D5A":
                        ft = FileType.PEFile;
                        break;
                    case "D0CF":
                        ft = FileType.Office2003;
                        break;
                    case "504B":
                        //0ffice2007、2010与zip文件的头部
                        //前面几个字节相同,必须更长的才能判断
                        if (fileHead == "504B0304140006")
                        {
                            ft = FileType.Office07And10;
                        }
                        else//zip文件
                        {
                            ft = FileType.ZIPFile;
                        }
                        break;
                    case "2550":
                        ft = FileType.PDFFile;
                        break;
                    case "5261":
                        ft = FileType.RARFile;
                        break;
                    case "8950":
                        ft = FileType.PNGFile;
                        break;
                    case "FFD8":
                        ft = FileType.JPGFile;
                        break;
                    case "4143":
                        ft = FileType.DWGFile;
                        break;
                    default:
                        ft = FileType.Undefined;
                        break;
                }
                return ft;
            }
    
            /// <summary>
            /// 获取文件头
            /// </summary>
            /// <param name="filePath">文件路径</param>
            /// <returns>长度7的字节数组换成16进制字符串14个</returns>
            private string GetFileHead(string filePath)
            {
                //存放头部信息
                string strHeadInfo = string.Empty;
                byte[] buff = new byte[7];
                FileStream fs = new FileStream(filePath, FileMode.Open);
                fs.Seek(0, SeekOrigin.Begin);
                fs.Read(buff, 0, buff.Length);
                strHeadInfo = byteToHexStr(buff);
                fs.Close();
                return strHeadInfo;
            }
    
            ///<summary>        
            /// 字节数组转16进制字符串        
            ///</summary>        
            ///<param name="bytes">读取的字节数组</param>        
            ///<returns></returns>
            private string byteToHexStr(byte[] bytes)
            {
                string returnStr = "";
                if (bytes != null)
                {
                    for (int i = 0; i < bytes.Length; i++)
                    {
                        returnStr += bytes[i].ToString("X2");
                    }
                }
                return returnStr;
            }
        }
     
  • 相关阅读:
    自制flash3D变换类
    Alchemy的使用和多项式批量计算的优化
    Bresenham直线扫描算法
    模拟流体粒子运动
    任意多边形的碰撞检测——向量积判断方法
    漂亮的雪花飘落和堆积效果
    发个简单怡情的粒子随机运动
    三次贝塞尔曲线绘制算法(优化过)
    失败是成功之母
    typeid操作符
  • 原文地址:https://www.cnblogs.com/qfcndtt/p/2835667.html
Copyright © 2011-2022 走看看