项目中功能很多,可以播放很多媒体文件,flash、图片、视频、office等等都可以,但需要用户设定好每个文件需要怎样的播放方式。如果弄错了,比如flash却用播放视频的办法去做,就会出错。虽然很少见,能免则免,故想办法解决这个问题。

      思来想去只有在播放之前确定文件的类型,比较傻,但有效。

      首先当然是从后缀名开始。代码很简单:

      Path.GetExtension(filePath).ToLower();

      将取到的string都转成小写方便比较,拿到后直接判断是什么类型就可以了。

      但是,这样做显然不能满足所有的要求,因为后缀名是很容易被修改的,有多文件都不知道其真正是什么类型的了。所以,为了更加保险,还要想想别的办法。

      其实每种文件类型在系统中都已定义好了自己的标记,叫做Header,一般是文件的前几个字节,比如swf的前三个字节是“435753”或者“465753”,第四个是编译版本,第五到八个则是文件的大小。故我收集了一些文件类型的Header,在程序中来判断。

      SWF (swf):"435753"或者“465753"
      JPEG (jpg):"FFD8FF"
      PNG (png):"89504E47"
      GIF (gif):"47494638"
      TIFF (tif):"49492A00"
      Bitmap (bmp):"424D"
      CAD (dwg):"41433130"
      XML (xml):"3C3F786D6C"
      HTML (html):"68746D6C3E"));
      Word/Excel (xls.or.doc):"D0CF11E0"
      Access (mdb):"5374616E64617264204A"
      ZIP Archive (zip):"504B0304"
      RAR Archive (rar):"52617221"
      Wave (wav):"57415645"
      AVI (avi):"41564920"
      Real Media (rm):"2E524D46"
      MPEG (mpg):"000001BA"或者"000001B3"
      Quicktime (mov):"6D6F6F76"
      Windows Media (asf):"3026B2758E66CF11"

      取Header代码也很简单,要取几个字节,可以自己决定:

      System.IO.FileStream  fs=new System.IO.FileStream(filePath,System.IO.FileMode.Open,System.IO.FileAccess.Read); 
      System.IO.BinaryReader r=new System.IO.BinaryReader(fs); 
      string typeHeader=""; 
      byte buffer; 
      try 
      { 
            buffer=r.ReadByte(); 
            typeHeader=Convert.ToString(buffer, 16);

            buffer=r.ReadByte();  
            typeHeader+=Convert.ToString(buffer, 16);

            ...

       }

      然后再与上述Header比较,就可以知道文件是何类型。也许还是有很多的问题,希望大家多指出,谢谢

posted on 2009-05-27 14:55  Jason Yao  阅读(539)  评论(1编辑  收藏  举报