没有后缀名的文件,如何确定它的类型

时间:2022-05-08 10:05:53
文件有后缀名时,如C:\hello.jpg,我可以通过字符串查找获得它的后缀名:jpg;

但假设没有后缀名,如C:\hello, 我如何确定它是.txt、是.exe,还是.jpg文件呢?
有没有一个科学的方法检测文件类型?请大家解答一下,感激!

17 个解决方案

#1


没有。。。。。

#2


这个真做不了,现在的文件类型太多了。当你直接双击打开没有后缀的文件时,操作系统会打开一个窗口,让你选择打开方式。操作系统都做不了的事,你也很难。

#3


这难度太大了吧。。。

#4


一些特殊的文件可以根据文件结构来判断, 比如bmp文件的文件头是BM开头, png格式也有类似的文件头, exe程序是PE格式, 研究一个PE格式后也可以根据该格式的特点来判断一个文件的类型

完.....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 

#8


对于标准的类型文件, 一般都有文件头, 但是对于很多自定义的文件, 就可能没有文件头了, 就算有, 你也不知道是什么格式.

#9


引用 7 楼 zilaishuichina 的回复:
百度了一下 常见文件的文件头
但是不代表以 一下开头的就一定是该文件。。。

用文件头判断。直接读取文件的前几个字节。
常用文件的文件头如下(16进制):
JPEG (jpg),文件头:FFD8FF  
PNG (png),文件头:89504E47  
GIF (gif),文件头:47494638  
TIFF (tif),文件头:49492A00  
……

#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


该回复于2015-08-24 15:33:04被管理员删除

#11


感觉有点困难诶。

#12


引用 10 楼 zhcosin 的回复:
在路上看到一泡屎,你鉴定鉴定这是谁拉的?



DNA验证

#13


引用 10 楼 zhcosin 的回复:
在路上看到一泡屎,你鉴定鉴定这是谁拉的?

记得有一条新闻是说美国某高档社区建立了园区内狗的DNA档案库,用来鉴定谁家*乱拉不清理! 没有后缀名的文件,如何确定它的类型

#14


读取文件开头的字节吧

#15


谢谢各位回答哈,很精彩

我是想在用socket传输多个大型文件时,假设用户把后缀名都隐藏起来了,如何保证从一端到另一端的文件还是原来那种格式, 如:把一个jpg文件传过去以后人家收到的就是jpg, 而不是exe(因为在传输过程中通常情况下都是以二进制实现的对吧)

#16


引用 15 楼 veryhehe2011 的回复:
谢谢各位回答哈,很精彩

我是想在用socket传输多个大型文件时,假设用户把后缀名都隐藏起来了,如何保证从一端到另一端的文件还是原来那种格式, 如:把一个jpg文件传过去以后人家收到的就是jpg, 而不是exe(因为在传输过程中通常情况下都是以二进制实现的对吧)


推荐使用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

#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 

#8


对于标准的类型文件, 一般都有文件头, 但是对于很多自定义的文件, 就可能没有文件头了, 就算有, 你也不知道是什么格式.

#9


引用 7 楼 zilaishuichina 的回复:
百度了一下 常见文件的文件头
但是不代表以 一下开头的就一定是该文件。。。

用文件头判断。直接读取文件的前几个字节。
常用文件的文件头如下(16进制):
JPEG (jpg),文件头:FFD8FF  
PNG (png),文件头:89504E47  
GIF (gif),文件头:47494638  
TIFF (tif),文件头:49492A00  
……

#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


该回复于2015-08-24 15:33:04被管理员删除

#11


感觉有点困难诶。

#12


引用 10 楼 zhcosin 的回复:
在路上看到一泡屎,你鉴定鉴定这是谁拉的?



DNA验证

#13


引用 10 楼 zhcosin 的回复:
在路上看到一泡屎,你鉴定鉴定这是谁拉的?

记得有一条新闻是说美国某高档社区建立了园区内狗的DNA档案库,用来鉴定谁家*乱拉不清理! 没有后缀名的文件,如何确定它的类型

#14


读取文件开头的字节吧

#15


谢谢各位回答哈,很精彩

我是想在用socket传输多个大型文件时,假设用户把后缀名都隐藏起来了,如何保证从一端到另一端的文件还是原来那种格式, 如:把一个jpg文件传过去以后人家收到的就是jpg, 而不是exe(因为在传输过程中通常情况下都是以二进制实现的对吧)

#16


引用 15 楼 veryhehe2011 的回复:
谢谢各位回答哈,很精彩

我是想在用socket传输多个大型文件时,假设用户把后缀名都隐藏起来了,如何保证从一端到另一端的文件还是原来那种格式, 如:把一个jpg文件传过去以后人家收到的就是jpg, 而不是exe(因为在传输过程中通常情况下都是以二进制实现的对吧)


推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose  //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了

#17


楼上赵老师经典了。