如何获取未知文件的文件类型,如.txt后缀被去掉了

2024-12-05 12:50:00
推荐回答(5个)
回答1:

这显然要先了解一下什么是文本类的文件,其实说白了,就是ACSII码文件。二进制文件与文本文件的显著差别在于:二进制文件中可能会出现数目众多的0,而文本文件中则不会有,因为文本文件中除了一些特殊的控制字符(比如\n,\r,\t)以外,都是可见字符。

补充1:
除了.txt文件以外,其它的各种文件似乎都会有二进制文件头,这些文件头都很特别,比如0xFEFE、0xFDFD等等。必须说明的一点是.doc文件严格的说,它不应该是一个文本文件,因为它内部有大量的不可见的控制字符,而且最关键的是,它内部允许包含0,并且它有二进制的头数据块。
如果你真想鉴别所有的,你所期望的文本类文件的话,比如.txt、.doc这些文件,你就必须了解这些文件的文件格式,当然.txt是没有固定格式的,但它有一个特征是,不会含有0。
补充2:
对于unicode的文本文件来说,它也是有文件头的,根据大小尾的不同,分别是FFFE和FEFF,严格的说,unicode的文件,不能说是文本文件。
回到你的补充问题,如果想确认一个文件是不是文本文件,加入说是ANSI的,你可以遍历整个文件,看是否存在0,如果没有那么就是了,如果具有FFFE或者FEFF文件头的unicode文件,那么你所关注的对象是,00,也就是两个连续的0。

回答2:

文件头内容?txt?文件头内容是多少字节?

我想光判断头部内容,不足以断定是文本文件吧?而且如果有汉字文本文件就更不好判断了。

楼上有人说了文本文件没有固定格式的,要看你怎么理解文本文件,

有些文本文件的内容是Unicode也是会包含0的,

如果文本文件里有汉字那就更复杂,

下面的代码是假设文本文件为常见的符号:

#include  
#include 
#include 

bool istxt(char ch);

int main(void) 

    FILE* file = fopen("c:\\1.dat", "rb");
    if (!file)
    {
        printf("file open fail!\n");
        return -1;
    }
    fseek(file, 0, SEEK_END);
    int iLen = ftell(file);
    
    fseek(file, 0, SEEK_SET);
    char *pDicBuf = (char*)malloc(iLen);
    fread(pDicBuf, 1, iLen, file);
    fclose(file);
    
    bool btxt = true;
    for(int i = 0; i < iLen && btxt; i++)
    {
        if(!pDicBuf[i])
            btxt = false;
    }
    
    free(pDicBuf);
    
    if(btxt)
        printf("是文本文件");
    else 
        printf("不是文本文件");
    
    getchar();
    
    return 0; 
}

bool istxt(char ch)
{
    //取决于你怎么定义文本文件
    if(ch >= 0x21 && ch <= 0x7e || ch == '\r' || ch == '\n' || ch == '\t')
        return true;
    return false;
}

回答3:

bmp,jpg等图象文件,可以判断文件头,来确定它的文件类型

但txt没有文件头的,无法判断它是否是txt文件

所以,只能分析文件中所有数据,看看是不是都是可以显示的字符

如果都是可以显示的字符,说明它可以当作txt文件进行阅读,否则,会有乱码出现

回答4:

windows下我还没有用过这种命令!
一般都是通过后缀来识别文件类型的。

如果在Linux下的话,用file filename即可查看类型

如:
[root@cn tmp]# file mapping-root
mapping-root: socket

[root@cn tmp]# file 111.ccc
111.ccc: ASCII text

回答5:

最简单的方法:
用代码读出文件的前几个字符,判断读出的内容是不是都是可显字符或汉字,如果都是就是文本文件,如果不是比如出现0x55之类的东西,就不是了。
关于可显字符识别和汉字识别网上有现成代码,很简单,就是判断读取字符的大小落在哪个范围了。
只读取部分文件不太可靠,遇到某别比较BT的文件,文件头刚好都是英文,后面是其他的就不好说,容易误判。
最可靠就是把文件都读了然后全部判断,但是太费时了。
可以权衡一下,定一个比较合适的读取长度,比如1M?估计大部分常见文件都不会有那么大的头部都是可显的。