但假设没有后缀名,如C:\hello, 我如何确定它是.txt、是.exe,还是.jpg文件呢?
有没有一个科学的方法检测文件类型?请大家解答一下,感激!
17 个解决方案
#1
没有。。。。。
#2
这个真做不了,现在的文件类型太多了。当你直接双击打开没有后缀的文件时,操作系统会打开一个窗口,让你选择打开方式。操作系统都做不了的事,你也很难。
#3
这难度太大了吧。。。
#4
一些特殊的文件可以根据文件结构来判断, 比如bmp文件的文件头是BM开头, png格式也有类似的文件头, exe程序是PE格式, 研究一个PE格式后也可以根据该格式的特点来判断一个文件的类型
完.....zzzz
完.....zzzz
#5
对常见的文件类型,通常可以16进制方式打开文件看开头的地方有没有什么关键字符,然后上网搜索一下
#6
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
#7
百度了一下 常见文件的文件头
但是不代表以 一下开头的就一定是该文件。。。
用文件头判断。直接读取文件的前几个字节。
常用文件的文件头如下(16进制):
JPEG (jpg),文件头:FFD8FF
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
TIFF (tif),文件头:49492A00
Windows Bitmap (bmp),文件头:424D
CAD (dwg),文件头:41433130
Adobe Photoshop (psd),文件头:38425053
Rich Text Format (rtf),文件头:7B5C727466
XML (xml),文件头:3C3F786D6C
HTML (html),文件头:68746D6C3E
Email [thorough only] (eml),文件头:44656C69766572792D646174653A
Outlook Express (dbx),文件头:CFAD12FEC5FD746F
Outlook (pst),文件头:2142444E
MS Word/Excel (xls.or.doc),文件头:D0CF11E0
MS Access (mdb),文件头:5374616E64617264204A
WordPerfect (wpd),文件头:FF575043
Adobe Acrobat (pdf),文件头:255044462D312E
Quicken (qdf),文件头:AC9EBD8F
Windows Password (pwl),文件头:E3828596
ZIP Archive (zip),文件头:504B0304
RAR Archive (rar),文件头:52617221
Wave (wav),文件头:57415645
AVI (avi),文件头:41564920
Real Audio (ram),文件头:2E7261FD
Real Media (rm),文件头:2E524D46
MPEG (mpg),文件头:000001BA
MPEG (mpg),文件头:000001B3
Quicktime (mov),文件头:6D6F6F76
Windows Media (asf),文件头:3026B2758E66CF11
MIDI (mid),文件头:4D546864
但是不代表以 一下开头的就一定是该文件。。。
用文件头判断。直接读取文件的前几个字节。
常用文件的文件头如下(16进制):
JPEG (jpg),文件头:FFD8FF
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
TIFF (tif),文件头:49492A00
Windows Bitmap (bmp),文件头:424D
CAD (dwg),文件头:41433130
Adobe Photoshop (psd),文件头:38425053
Rich Text Format (rtf),文件头:7B5C727466
XML (xml),文件头:3C3F786D6C
HTML (html),文件头:68746D6C3E
Email [thorough only] (eml),文件头:44656C69766572792D646174653A
Outlook Express (dbx),文件头:CFAD12FEC5FD746F
Outlook (pst),文件头:2142444E
MS Word/Excel (xls.or.doc),文件头:D0CF11E0
MS Access (mdb),文件头:5374616E64617264204A
WordPerfect (wpd),文件头:FF575043
Adobe Acrobat (pdf),文件头:255044462D312E
Quicken (qdf),文件头:AC9EBD8F
Windows Password (pwl),文件头:E3828596
ZIP Archive (zip),文件头:504B0304
RAR Archive (rar),文件头:52617221
Wave (wav),文件头:57415645
AVI (avi),文件头:41564920
Real Audio (ram),文件头:2E7261FD
Real Media (rm),文件头:2E524D46
MPEG (mpg),文件头:000001BA
MPEG (mpg),文件头:000001B3
Quicktime (mov),文件头:6D6F6F76
Windows Media (asf),文件头:3026B2758E66CF11
MIDI (mid),文件头:4D546864
#8
对于标准的类型文件, 一般都有文件头, 但是对于很多自定义的文件, 就可能没有文件头了, 就算有, 你也不知道是什么格式.
#9
#include <stdio.h>
struct EH {
char e[32];
char h[32];
} eh[29]={
{"Windows Bitmap (bmp)" , "424D"},
{"JPEG (jpg)" , "FFD8FF"},
{"MPEG (mpg)" , "000001B3"},
{"MPEG (mpg)" , "000001BA"},
{"Outlook (pst)" , "2142444E"},
{"Real Media (rm)" , "2E524D46"},
{"Real Audio (ram)" , "2E7261FD"},
{"Adobe Photoshop (psd)" , "38425053"},
{"CAD (dwg)" , "41433130"},
{"AVI (avi)" , "41564920"},
{"GIF (gif)" , "47494638"},
{"TIFF (tif)" , "49492A00"},
{"MIDI (mid)" , "4D546864"},
{"ZIP Archive (zip)" , "504B0304"},
{"RAR Archive (rar)" , "52617221"},
{"Wave (wav)" , "57415645"},
{"Quicktime (mov)" , "6D6F6F76"},
{"PNG (png)" , "89504E47"},
{"Quicken (qdf)" , "AC9EBD8F"},
{"MS Word/Excel (xls.or.doc)" , "D0CF11E0"},
{"Windows Password (pwl)" , "E3828596"},
{"WordPerfect (wpd)" , "FF575043"},
{"XML (xml)" , "3C3F786D6C"},
{"HTML (html)" , "68746D6C3E"},
{"Rich Text Format (rtf)" , "7B5C727466"},
{"Adobe Acrobat (pdf)" , "255044462D312E"},
{"Windows Media (asf)" , "3026B2758E66CF11"},
{"Outlook Express (dbx)" , "CFAD12FEC5FD746F"},
{"MS Access (mdb)" , "5374616E64617264204A"},
};
FILE *f;
static char s[32];
int i,j,c;
int main(int argc,char **argv) {
if (argc<2 || argc>2) {
fprintf(stderr,"GuessFileExt according to head bytes.\nUsage: %s filename\n",argv[0]);
return 1;
}
f=fopen(argv[1],"rb");
if (NULL==f) {
fprintf(stderr,"Can not open file %s\n",argv[1]);
return 2;
}
for (i=0;i<14;i++) {
c=fgetc(f);
if (c==EOF) break;//
sprintf(s+i*2,"%2X",(unsigned char)c);
for (j=0;j<29;j++) {
if (0==strcmp(s,eh[j].h)) {
printf("%s\n",eh[j].e);
fclose(f);
return 0;
}
}
}
printf("Unknown\n");
fclose(f);
return 3;
}
#10
#11
感觉有点困难诶。
#12
DNA验证
#13
记得有一条新闻是说美国某高档社区建立了园区内狗的DNA档案库,用来鉴定谁家*乱拉不清理!
#14
读取文件开头的字节吧
#15
谢谢各位回答哈,很精彩
我是想在用socket传输多个大型文件时,假设用户把后缀名都隐藏起来了,如何保证从一端到另一端的文件还是原来那种格式, 如:把一个jpg文件传过去以后人家收到的就是jpg, 而不是exe(因为在传输过程中通常情况下都是以二进制实现的对吧)
我是想在用socket传输多个大型文件时,假设用户把后缀名都隐藏起来了,如何保证从一端到另一端的文件还是原来那种格式, 如:把一个jpg文件传过去以后人家收到的就是jpg, 而不是exe(因为在传输过程中通常情况下都是以二进制实现的对吧)
#16
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待
和
fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了
#17
楼上赵老师经典了。
#1
没有。。。。。
#2
这个真做不了,现在的文件类型太多了。当你直接双击打开没有后缀的文件时,操作系统会打开一个窗口,让你选择打开方式。操作系统都做不了的事,你也很难。
#3
这难度太大了吧。。。
#4
一些特殊的文件可以根据文件结构来判断, 比如bmp文件的文件头是BM开头, png格式也有类似的文件头, exe程序是PE格式, 研究一个PE格式后也可以根据该格式的特点来判断一个文件的类型
完.....zzzz
完.....zzzz
#5
对常见的文件类型,通常可以16进制方式打开文件看开头的地方有没有什么关键字符,然后上网搜索一下
#6
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
#7
百度了一下 常见文件的文件头
但是不代表以 一下开头的就一定是该文件。。。
用文件头判断。直接读取文件的前几个字节。
常用文件的文件头如下(16进制):
JPEG (jpg),文件头:FFD8FF
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
TIFF (tif),文件头:49492A00
Windows Bitmap (bmp),文件头:424D
CAD (dwg),文件头:41433130
Adobe Photoshop (psd),文件头:38425053
Rich Text Format (rtf),文件头:7B5C727466
XML (xml),文件头:3C3F786D6C
HTML (html),文件头:68746D6C3E
Email [thorough only] (eml),文件头:44656C69766572792D646174653A
Outlook Express (dbx),文件头:CFAD12FEC5FD746F
Outlook (pst),文件头:2142444E
MS Word/Excel (xls.or.doc),文件头:D0CF11E0
MS Access (mdb),文件头:5374616E64617264204A
WordPerfect (wpd),文件头:FF575043
Adobe Acrobat (pdf),文件头:255044462D312E
Quicken (qdf),文件头:AC9EBD8F
Windows Password (pwl),文件头:E3828596
ZIP Archive (zip),文件头:504B0304
RAR Archive (rar),文件头:52617221
Wave (wav),文件头:57415645
AVI (avi),文件头:41564920
Real Audio (ram),文件头:2E7261FD
Real Media (rm),文件头:2E524D46
MPEG (mpg),文件头:000001BA
MPEG (mpg),文件头:000001B3
Quicktime (mov),文件头:6D6F6F76
Windows Media (asf),文件头:3026B2758E66CF11
MIDI (mid),文件头:4D546864
但是不代表以 一下开头的就一定是该文件。。。
用文件头判断。直接读取文件的前几个字节。
常用文件的文件头如下(16进制):
JPEG (jpg),文件头:FFD8FF
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
TIFF (tif),文件头:49492A00
Windows Bitmap (bmp),文件头:424D
CAD (dwg),文件头:41433130
Adobe Photoshop (psd),文件头:38425053
Rich Text Format (rtf),文件头:7B5C727466
XML (xml),文件头:3C3F786D6C
HTML (html),文件头:68746D6C3E
Email [thorough only] (eml),文件头:44656C69766572792D646174653A
Outlook Express (dbx),文件头:CFAD12FEC5FD746F
Outlook (pst),文件头:2142444E
MS Word/Excel (xls.or.doc),文件头:D0CF11E0
MS Access (mdb),文件头:5374616E64617264204A
WordPerfect (wpd),文件头:FF575043
Adobe Acrobat (pdf),文件头:255044462D312E
Quicken (qdf),文件头:AC9EBD8F
Windows Password (pwl),文件头:E3828596
ZIP Archive (zip),文件头:504B0304
RAR Archive (rar),文件头:52617221
Wave (wav),文件头:57415645
AVI (avi),文件头:41564920
Real Audio (ram),文件头:2E7261FD
Real Media (rm),文件头:2E524D46
MPEG (mpg),文件头:000001BA
MPEG (mpg),文件头:000001B3
Quicktime (mov),文件头:6D6F6F76
Windows Media (asf),文件头:3026B2758E66CF11
MIDI (mid),文件头:4D546864
#8
对于标准的类型文件, 一般都有文件头, 但是对于很多自定义的文件, 就可能没有文件头了, 就算有, 你也不知道是什么格式.
#9
#include <stdio.h>
struct EH {
char e[32];
char h[32];
} eh[29]={
{"Windows Bitmap (bmp)" , "424D"},
{"JPEG (jpg)" , "FFD8FF"},
{"MPEG (mpg)" , "000001B3"},
{"MPEG (mpg)" , "000001BA"},
{"Outlook (pst)" , "2142444E"},
{"Real Media (rm)" , "2E524D46"},
{"Real Audio (ram)" , "2E7261FD"},
{"Adobe Photoshop (psd)" , "38425053"},
{"CAD (dwg)" , "41433130"},
{"AVI (avi)" , "41564920"},
{"GIF (gif)" , "47494638"},
{"TIFF (tif)" , "49492A00"},
{"MIDI (mid)" , "4D546864"},
{"ZIP Archive (zip)" , "504B0304"},
{"RAR Archive (rar)" , "52617221"},
{"Wave (wav)" , "57415645"},
{"Quicktime (mov)" , "6D6F6F76"},
{"PNG (png)" , "89504E47"},
{"Quicken (qdf)" , "AC9EBD8F"},
{"MS Word/Excel (xls.or.doc)" , "D0CF11E0"},
{"Windows Password (pwl)" , "E3828596"},
{"WordPerfect (wpd)" , "FF575043"},
{"XML (xml)" , "3C3F786D6C"},
{"HTML (html)" , "68746D6C3E"},
{"Rich Text Format (rtf)" , "7B5C727466"},
{"Adobe Acrobat (pdf)" , "255044462D312E"},
{"Windows Media (asf)" , "3026B2758E66CF11"},
{"Outlook Express (dbx)" , "CFAD12FEC5FD746F"},
{"MS Access (mdb)" , "5374616E64617264204A"},
};
FILE *f;
static char s[32];
int i,j,c;
int main(int argc,char **argv) {
if (argc<2 || argc>2) {
fprintf(stderr,"GuessFileExt according to head bytes.\nUsage: %s filename\n",argv[0]);
return 1;
}
f=fopen(argv[1],"rb");
if (NULL==f) {
fprintf(stderr,"Can not open file %s\n",argv[1]);
return 2;
}
for (i=0;i<14;i++) {
c=fgetc(f);
if (c==EOF) break;//
sprintf(s+i*2,"%2X",(unsigned char)c);
for (j=0;j<29;j++) {
if (0==strcmp(s,eh[j].h)) {
printf("%s\n",eh[j].e);
fclose(f);
return 0;
}
}
}
printf("Unknown\n");
fclose(f);
return 3;
}
#10
#11
感觉有点困难诶。
#12
DNA验证
#13
记得有一条新闻是说美国某高档社区建立了园区内狗的DNA档案库,用来鉴定谁家*乱拉不清理!
#14
读取文件开头的字节吧
#15
谢谢各位回答哈,很精彩
我是想在用socket传输多个大型文件时,假设用户把后缀名都隐藏起来了,如何保证从一端到另一端的文件还是原来那种格式, 如:把一个jpg文件传过去以后人家收到的就是jpg, 而不是exe(因为在传输过程中通常情况下都是以二进制实现的对吧)
我是想在用socket传输多个大型文件时,假设用户把后缀名都隐藏起来了,如何保证从一端到另一端的文件还是原来那种格式, 如:把一个jpg文件传过去以后人家收到的就是jpg, 而不是exe(因为在传输过程中通常情况下都是以二进制实现的对吧)
#16
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待
和
fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了
#17
楼上赵老师经典了。