思来想去只有在播放之前确定文件的类型,比较傻,但有效。
首先当然是从后缀名开始。代码很简单:
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比较,就可以知道文件是何类型。也许还是有很多的问题,希望大家多指出,谢谢