例如说,某个.EXE被人改成了.RAR 或者 .DOC 或者干脆删除了后缀名那么在有没有办法猜测出该文件的原始类型?求思路!

解决方案 »

  1.   

    如果是你自己颁发的文件格式,你可以要求文件根据某种你自己定义的标准来存储。比如 Gif 图片的首三个(偶见六个)都是 GIF 字样如果是任意类型的文件,没有什么特别的办法:文件说到底都是字节流,谁也没法规定哪种样子的流就必须是某种类型。
    典型的 windows 应用,如 word、windows media player 等软件,你把任意文件改为它们接受的后缀,如 .docx 或 .wma,它们照读不误——只是当发现试图读的时候出现错误,这才发现这原来是一个错误的文件(Bad Format)此外,通常情况下,一个 mp3 音频文件的后缀被改成了 wma,播放器还是能放因此,对于任意文件并没有办法来猜测它的原始类型,甚至很多文件干脆没有原始类型(比如随便一个流)
      

  2.   

    前10个字节using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;public partial class test_TrueFile : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {    }
        /// <summary>
        /// C#检测真实文件类型函数
        /// </summary>
        /// <param name="hifile"></param>
        /// <returns></returns>
        private bool IsAllowedExtension(HttpPostedFile hifile)
        {
            bool ret = false;        System.IO.FileStream fs = new System.IO.FileStream(hifile.FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);
            System.IO.BinaryReader r = new System.IO.BinaryReader(fs);
            string fileclass = "";
            byte buffer;
            try
            {
                buffer = r.ReadByte();
                fileclass = buffer.ToString();
                buffer = r.ReadByte();
                fileclass += buffer.ToString();
            }
            catch
            {
                return false;
            }
            r.Close();
            fs.Close();
            /*文件扩展名说明
             *4946/104116 txt
             *7173        gif 
             *255216      jpg
             *13780       png
             *6677        bmp
             *239187      txt,aspx,asp,sql
             *208207      xls.doc.ppt
             *6063        xml
             *6033        htm,html
             *4742        js
             *8075        xlsx,zip,pptx,mmap,zip
             *8297        rar   
             *01          accdb,mdb
             *7790        exe,dll           
             *5666        psd 
             *255254      rdp 
             *10056       bt种子 
             *64101       bat 
             *4059        sgf
             */
            //String[] fileType = { "255216", "7173", "6677", "13780", "8297", "5549", "870", "87111", "8075" };        //纯图片
            String[] fileType = { 
                "7173",    //gif
                "255216",  //jpg
                "13780"    //png
            };        for (int i = 0; i < fileType.Length; i++)
            {
                if (fileclass == fileType[i])
                {
                    ret = true;
                    break;
                }
            }
            Response.Write(fileclass);//可以在这里输出你不知道的文件类型的扩展名
            return ret;
        }
        protected void btnOk_Click(object sender, EventArgs e)
        {
            if (IsAllowedExtension(uploadFile.PostedFile))
            {
                Response.Write("ok");
            }
        }
    }
    格式参考
      

  3.   

    上传时可以判断            //取得文件MIME内容类型
                string type = this.fuImage.PostedFile.ContentType.ToLower();          if (type.Contains("image"))//图片的MIME类型为"image/xxx",这里只判断是否图片
      

  4.   

    我倒是搜索出个软件TrIDNet
    http://tech.163.com/07/0727/08/3KD75U8D000917GQ.html
    下载地址:
    http://download.csdn.net/source/3017082
    它里面附带了770个XML,对应了770个后缀。配合3楼的大师的代码便可以解决问题了非常感谢!