在windows下,文件类型一般以后缀名的形式体现,但后缀名却是可以随意更改的。甚至在linux下,本身是没有后缀名的概念的。在很多应用中,需要判断文件的真实类型,例如web上传文件等
在网上有很多都是简单识别下文件特征,例如jpg、png、mp4这些常见的格式,那么有没有很全面的文件类型识别的方法呢?当然是有的
当时调研了很多库,发现linux下开源的file所覆盖的范围当属第一,纯c代码,通过阅读源码可以知道,既可以通过magic文件拓展识别特征,还能对文本判断编码、是CR、LF还是CRLF之类的,可谓是面面俱到。
那么使用起来如何?有两种方法,一种是直接用shell调file,直接把文件路径传进去,管道获取返回结果,这种看起来就很low,如果是频繁调用的话,性能也是存在很大问题的,所以还是需要直接使用libmagic.so的接口,需在GitHub上把最新的file拉下来编译make install,然后参考file的源码可以抠出使用方法
使用方法很简单:
1、根据需求,设置flags为
a、MAGIC_EXTENSION,用于获取文件真实后缀,由于目前magic里面的后缀不是很全,还需要自行补充很多 !ext:xxx
b、MAGIC_MIME_ENCODING|MAGIC_MIME_TYPE,用于获取文件MIME类型以及文本编码,看了下现有的magic文件,MIME是非常全的,推荐使用这种方法做类型判断
2、调用load,指定magicfile路径,传入flags
3、创建个128K的Buffer(根据多种类型实验,自己推断出的一个大致比较准确高效的值),将文件读取出来放在Buffer上
4、调用magic_buffer 返回即为需要的数据
- #include<magic.h>
- void test(){
- int flags=0;
- struct magic_set* g_magic=load(magic_file_path,flags);
- const char* ret=magic_buffer(g_magic,buf,len);
- }