准确的说,辨别文件类型并不是操作系统的责任,而是具体使用某个文件的「应用程序」的责任。
如果你使用Windows的资源管理器来辨别文件,那么确实是要依赖扩展名。
事实上,早期版本的Windows资源管理器甚至会拒绝创建点开头的文件名,虽然实际上Windows系统支持这样的文件名(使用命令行可以创建你想要的名字的文件),但无法在资源管理器内创建。可以明显看出文件名+扩展名的这个机制是资源管理器这个「应用程序」强加的,而不是Windows操作系统本身的限制。
Linux要求没有这么高,其实这也与Linux本身没关系,只与你具体使用的某个应用程序有关系。如果你用了一个必须强制要求检测扩展名的应用程序,在这个程序内依然还是要依赖扩展名。
当然,Linux 有一个叫做 file 的程序,可以专门用来检测文件类型。你可以看到,它检测文件类型确实并不依赖文件名以及扩展名,除非是根本无法检测的情况下,才会依赖扩展名。由于这个文件是开源的,因此,理论上,哪怕你的私有文件,也可以将相关的类型检测代码植入进去,让file能够检测出来你的文件类型。
poet:~/share$ file kotlin-compiler-1.5.20.zip kotlin-compiler-1.5.20.zip: Zip archive data, at least v1.0 to extract poet:~/share$ cp kotlin-compiler-1.5.20.zip noname poet:~/share$ file noname noname: Zip archive data, at least v1.0 to extract poet:~/share$
上边的实验可以发现,即便我们将一个 zip 文件改名为没有扩展名的情况,file 程序依然可以正确检测它的文件类型。
对于可执行文件也是一样的,file可以正确识别出文件是动态链接库还是执行文件还是脚本,对于执行文件,file可以正确识别它是不是当前架构的,是x86还是arm的。file检测文件类型并不需要依赖扩展名。
但是,具体来说,一个 Linux 应用程序,很可能并不使用 file 程序来检测文件类型,这样的话,它也完全有可能存在没扩展名就无法检测文件类型的情况。
具体的应用程序行为完全可能跟操作系统内的推荐行为不一致。
结论:
辨别文件上大家都是一样的本事,别想太多了。
扩展名只是个标记,一个约定,表示我这个文件是什么内容,但是没有,也不可能有任何实质的担保。你完全可以把一张图的扩展名标成.txt,把一个文本文件的扩展名标成.exe,顺便说一下,把docx的WORD文档改成.zip打开还有惊喜。
Windows只是提倡大家多使用扩展名罢了。Linux早年没那么提倡,但是Linux也完全不反对这么做。
正确使用扩展名的话,操作系统可以做一些额外的工作让用户有更好的体验。比如用不同的图标区分不同类型的文件,比如对满是图片的文件夹,自动调节成缩略图视图什么的。
完全不用扩展名,那操作系统只能把文件读一遍才知道是什么格式。这可不是什么好事,毕竟这大幅度增加硬盘负担,你多半不会乐意的。
而且很多的程序,包括操作系统的文件管理器,都不太乐意全靠自己详细地侦测文件是什么格式,而是扩展名说是什么格式,就当是什么格式。扩展名是错的,那程序就可能给出错误操作。这种错误Linux和Windows都会有。
我将一个文本文件改成.zip,无论Linux还是Windows都不能正确打开。并不存在谁就更聪明的情况。
Windows只是资源管理器会根据扩展名选择特定的程序去打开,但实际上程序如何读取这个文件如何判定这个文件的格式是程序自己的事情,可以通过扩展名也可以通过读取文件头的方式。你在Windows里面把扩展名修改后也不意味着这个文件没法被相关程序读取了,因为扩展名这个东西只是文件系统的一部分。
Windows的扩展名本身继承自源于DOS的FAT文件系统的8.3规则,而这个命名系统据称参考了70年代末的那些小型机系统,再往前我就找不到溯源了,毕竟文件系统是磁盘诞生后才有的东西(纸带不需要文件名)
某年某月的某一天,一客户问我,为什么我有一张图片上传不了?
你把你的图片文件截图我看看。
好吧,是一张bmp图片。于是我对她说,系统不支持bmp,你转成png或jpg再上传吧。
过了几分钟,又问我,我转了,结果还是上传不了。
你再截个图我看看。
好吧,确实是png了,可为什么还是上传了不呢?
你把图片发给我试试。
图片到手,用软件读了一个文件头,泥麻,这不就是一张bmp改了一下扩展名吗?
所以,你扩展是什么不重要,重要的是,这文件内容得与扩展名一致呀。
======================================
某提某月的某一天,我上一公司培训,那里的员工对我特别热情。
其中有一位妹妹热情得我混身上下都不自在。唉呀老师,今天终于见到你本人了,在此之前光知其名不知其人,现在终于能将老师的名和老师的人关联到一起了。
好吧,我叫什么名不重要,重要的是,能将我这个人和我的名关联在一起才行。
扩展名也一样,对于一个文件,如果你非要把exe修改成txt,我觉得也没问题呀,但问题是,这明明是exe,为什么非要用txt当扩展名呢?可这windows也呆,他明明知道这不是txt,可还是会使用事本来打开,可打开就是一堆乱码。
======================================
有人说,如果计算机都用文件头来读就好了。
可是,有一回,我读了一个txt文件,用gbk读,乱码,因为这是utf8,可问题是,文本并没有携带文件头,我也不知道这是utf8编码呀。后来我学乖了,读之前要先判断一下有没有数据头,可是,有些utf8是真没有数据头,而使用记事本生成的txt有EFBBBF,可问题是,如果我用电脑写出一个txt,这里面以GBK编码的“锘卡”开头,也就是编码是EFBBBFA8,里面包含了EFBBBF,那记事本也一并显示乱码。因为,谁也没办法限制用户以什么内容对txt进行开头。所以,在这种情况下,我觉得扩展名也是非常有用的。
[doge]
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有