无论是windows还是linux,它们管理的文件都可以有扩展名,也可以要不要扩展名。因为它们辨别文件并不是用扩展名,而是用文件头信息。而文件扩展名的作用主要是关联应用程序,同时让电脑使用者可以方便地辨别文件类型。
1、扩展名的作用
winddows之所以被很多人误解用扩展名来辨别文件,是因为windows的图形化中看到的大部分文件都是有扩展名的。实际上,windows上也是有没有扩展名的文件。比如:c盘下的host系统文件就没有扩展名,负责本地解析域名和ip的对应关系,常被用户用来破解注册软件去联网。
linux之所以被很多人误解为它不要扩展名,是因为linux用户通常都在命令行下创建文件。自己创建文件习惯性不加扩展名,导致人们认为linux下的文件都没有扩展名。其实linux下也是有很多扩展名的,比如:最常见的.tar.gz,就是linux下压缩文件的类型。
不管是windows还是linux,扩展名的作用都是用来关联默认应用程序的。在windows系统中,我们可以找到一个“默认应用”的设置程序,上面可以设置扩展名和默认应用的关联关系。如果设置错了默认应用程序,你会发现这类文件将无法双击打开,只能自选选择正确的应用程序来打开了。在linux系统中,虽然没有这样的默认应用程序的设置。当然文件类型的关联在系统层面也是有的,比如:.o就是目标文件;.so就是共享库文件;.c是C语言文件;.deb是debian软件包;.py就是python源文件;.whl是python包。如果你要执行.py,你的系统上必须有python。
2、系统辨别文件
业内人士都知道,操作系统上的文件都是以二进制存储的,本质上是没有任何区别的。扩展名只是为了方便人类知道是什么类型文件,同时也用作关联默认应用程序。而操作系统辨别文件通常是通过读取文件的头信息的。比如:jpg文件的头标志是“FFD8FF”;PNG文件的头标志是“89504E47”;ZIP文件的头标志是“504B0304”。
当系统调用应用程序打开文件时,操作系统会检查该文件的权限以及安全属性。符合权限和安全设置时,应用程序就会启动去检查文件的头信息。如果文件头信息中的标志不属于该应用程序可以打开的类型,该应用程序会通知用户无法打开该文件。如果文件头信息的标志是可以打开的类型,应用程序会按照头信息里规定格式去解读该文件。这个时候,如果文件的真实内容和文件头信息规定的格式不相符,应用程序同样无法打开文件。甚至可能告诉你文件已经损坏。
总结
总之,文件扩展名主要是为了关联默认应用程序以及让人们更容易理解。而操作系统真正辨别文件还是靠读取文件头信息。
从开发角度:辨别文件类型有很多办法,但有了扩展名用肉眼即可识别,更方便。
在系统没运行的时候,比如用个u盘看到某些文件就知道它是干嘛的。
引申话题:如果开发人员仅用扩展名判断文件格式,那就太大意也太危险了。
不是Linux上没有这么高的要求,而是Linux的命令行界面打开文件的方式和在Windows下的图形界面打开文件的方式不一样。
举个例子,比如你要在Linux的终端用touch命令创建了一个名为“a”的空文件,你需要用编辑器打开它,你可以用命令“vim a”或者“nano a”。vim和nano是Linux下的两个我比较常用的文本编辑器。这个时候a是文件的文件名作为参数传递给程序。
如果是在Windows下,你会怎么打开这个文件?也许你会直接双击,但是Windows资源管理器不知道要用什么软件打开它。你也可以先打开记事本,然后点击菜单栏的文件,打开,但是记事本打开的窗口会默认使用文件扩展名来过滤文件,你可以在右下角选择文件类型为所有文件,即可选择没有扩展名的文件a,选择之后点击打开。
当然在Windows下也可以像Linux那样打开,比如在cmd或者powershell里notepad.exe C:a,把a文件的全路径作为参数传递给程序进行打开。如果文件在当前工作目录下可以忽略文件路径。
说了这么多,总而言之,Windows下打开不同类型的文件需要使用扩展名是因为Windows资源管理器来识别要用哪个程序来打开,如果你会看程序的启动参数,你就会发现用Windows资源管理器双击文件和在cmd里将文件路径作为程序的启动参数的命令是一样的。如果你直接用cmd也可以不用理会文件扩展名,但是你也会不知道这个文件应该用什么程序打开
Linux下还有一个file命令可以查看文件真正的类型。
有扩展名方便分类处理。