Windows和Linux识别文件的方式
【孙斌杰】
       计算机文件最基本的分类:文本文件和二进制文件。事实上,所有文件在计算机内部都是以二进制形式处理的。区别在于,文本文件依赖于特定字符编码,并且会解析为人可以阅读的字符集;二进制文件则是纯粹的字节流,数据的含义依赖于文件格式的约定和处理程序的解析机制。关于二者之间的优劣和选择,参看纯文本的威力。
       常见的文本文件有txt文本文件、htm/html网页文件、各种编程语言的源文件或脚本文件;常见的二进制文件有exe可执行文件(Windows平台)、bmp/jpg/gif/png图片文件、wav/mp3/wma/wmv/rmvb/avi音视频文件、doc/xls/ppt等Office文件、zip/rar/tar/gz归档压缩文件。
       Windows根据扩展名(文件名最后一个点后面的部分)来识别文件类型。比如Helloworld.txt是一个文本文件,Helloworld.c是一个C源文件,Helloworld.exe是一个二进制可执行文件,等等。
       Windows系统记录了可以识别的文件扩展名及打开对应文件的程序,可在指定文件的文件属性对话框的打开方式中看到和修改,或是在控制面板->文件夹选项的文件类型标签页查看全部已知文件类型,assoc和ftype命令也可以用来查看和修改已知文件类型的对应程序。这些信息实际上是记录在注册表的HKEY_CLASSES_ROOT之下。
       用扩展名识别文件类型在性能上占优,但倘若扩展名与文件格式不相符便可能带来错误。比如,把一个jpg或doc文件的扩展名改为txt,文件将会默认使用记事本打开,通常会看到一堆乱码(二进制文件的字节流通常不能完全对应到某种字符编码的可阅读字符);把一个文本文件的扩展名改为xls或mp3,文件在由EXCEL或mp3播放器打开时会因为文件格式不符而报错。
       因而Windows系统通常默认不显示文件扩展名(在控制面板->文件夹选项的查看标签页设置)。这样做带来的弊端是,一个名字形如"我不是病毒.txt.exe"的可执行文件倘若配上一个记事本的图标,因为最后的.exe扩展名被隐藏,则可能诱使一些大意的用户误点而执行。
       Linux采用一种叫做魔数(Magic Number)的机制来识别文件类型,通过解析文件内容开头的若干字节来判断相应文件格式。这种方案较扩展名方案更为准确安全,代价是要承担解析文件的性能开销。
       除识别文件类型外,Linux系统s通过文件的模式位(file mode bits)判断用户是否拥有某一文件的读(r)、写(w)和执行(x)的权限。
       以Perl编程为例。(通常,Perl指这种语言,perl指该语言的解释器程序名。)
       Perl是一种解释型语言,运行Perl脚本首先需要系统安装有Perl解释器。运行命令perl filename即会执行名为filename的Perl脚本。
       在Windows平台,最好指定Perl脚本的扩展名(通常为.pl)。安装Perl的过程中,通常默认把.pl文件关联到了Perl解释器,这样双击Helloworld.pl或直接运行命令Helloworld.pl即可执行该脚本。
       如下命令可以查看.pl文件的关联设置(>指Windows命令提示符的引导字符):
       >assoc .pl
       .pl=Perl.File
       >ftype Perl.File
       Perl.File="C:\strawberry\perl\bin\perl.exe" "%1" %*
       倘若安装程序没有进行如上默认关联,运行如下命令即可:
       assoc .pl=Perl.File
       ftype Perl.File="你的Perl安装路径\perl.exe" "%1" %*
       这样,当双击或运行一个.pl文件时,该文件的文件名会填充到如上设置中的%1,则会用指定的Perl解释器运行该文件。%*是指命令行参数。双引号的作用是为了防止路径中包含空格导致无法找到文件。
       如果实在想要让命令不包含扩展名,可以把.pl加入官网变量PATHEXT的最后。这样,运行命令Helloworld则可以自动执行Helloworld.pl(如果按照PATH和PATHEXT的查找顺序找到的是Helloworld.pl文件)。
       在Linux平台,不需要指定Perl脚本的扩展名。只需要在脚本的第一行加上Sha-Bang(即#!),指定Perl解释器的路径即可。脚本完成后,用chmod命令给文件加上可执行权限,即可作为命令来执行。
       比如如下Perl脚本:
       Perl code
       1 #!/usr/bin/perl
       2 print "Hello, world!\n";
       其中,#以后直到行尾的内容为注释,解释器将之忽略;但#!作为文件最开始的两个字节,Linux系统会根据之后的内容来判断解释程序。(因而Linux家族的脚本语言通常都将#作为注释,以支持#!。)
       在Windows平台,将以上代码保存为Helloworld.pl。运行perl Helloworld.pl或Helloworld.pl执行该脚本。
       在Linux平台,将以上代码保存为Helloworld,运行命令chmod a+x Helloworld给该文件加上可执行权限(对所有用户)。运行perl Helloworld或./Helloworld执行该脚本。
       其中,perl filename是通用的脚本运行方式——指定Perl解释器来运行指定的脚本文件,采用这种方式,不需要关联.pl扩展名(Windows平台),不需要增加可执行权限(Linux平台)。
       直接运行脚本命令时,在Linux平台需要在命令前加上./,是为了指明该可执行文件位于当前目录。与Windows不同,Linux在查找可执行文件时只从PATH官网变量指定的路径查找,不查找当前目录。
       最后说明一下脚本不包含扩展名的好处。
       如果编写的脚本将被作为一个在多处使用的命令,文件名不包含扩展名则降低了命令与其实现方式的耦合性。比如对于Helloworld命令,调用命令的用户不必关心它是用Perl、Python、Bash还是C编译实现的,如果使用Helloworld.pl作为命令名,倘若将来需要将之改为C编译的命令,命令名的更改将会是一件很讨厌的事情。
拉霸slots下载优德W88体育下载龙八国际官网