分享

文件后缀名和文件类型是什么关系、改后缀是否可以改变文件格式? |

 pgl147258 2014-08-18

狼大人的回答(12票)】:

结论前置:文件名和文件内容是独立不相关联的,而文件格式与文件内容是相关的。文件名后缀仅用于提供给系统 shell 一个关于文件类型的「暗示」。更改文件后缀名不会改变文件的「格式」,只会影响「系统默认打开这个文件的方式」。

文件是什么?

文件是存储在系统存储空间(如磁盘)中的一段数据。一个文件由一个特定程序创建,包含了对这个程序有特定含义的一段字节序列,因此每次这个程序打开这同一个文件的时候,获取到的信息是一样的。其它能够与上述程序以同样方式理解这段内容的程序也可以从这个文件中获取完全一样的信息。这个「理解这段内容的方法」就是文件格式。同一段内容可以有不同的解读方法,那么我们可以认为它是同时属于几种有效格式。譬如下面一段

int main() {return 0;}全部由可读的 ASCII 字符组成,所以它是一个纯文本文件;但熟悉 C 语言的人都可以看出这是一段 C 代码;认为它是 C++ 代码一样不会出错。

文件名是什么?

由于磁盘本身空间巨大,且有大量程序共同访问,一段内容存储在磁盘中可能不是连续的,可能位置会发生改变;且磁盘地址并非人类可以轻易理解的内容,所以有了文件名和路径。文件名和路径用于帮助人(通过程序)查找到某个特定的文件;同时文件名本身也可以作为一个「标签」告诉用户文件的内容,比如 README.txt 可以看出是一份说明文档。扩展名 txt 的部分也是类似,它只是这个文件的名字的一部分,用于告诉用户「这是一个 txt 文件」。

扩展名有什么用?

一个程序通常(或,默认)以一种特定的方式去读取用户要求它读取的文件。譬如记事簿 notepad.exe 和 vi 编辑器会默认将用户要求它打开的文件作为「纯文本格式」打开——即,文件中所有内容都是 ascii 编码、或其它系统默认编码下可以直接被人类阅读的文字。

用户打开一个文件的时候,可以是先进入某个程序再选择打开这个程序(File -> Open)或者在进入某个程序的时候同时打开某个文件(如 vi info.txt 命令);也可以通过在「文件管理器」或者其它 shell 程序中「双击」这个文件——让系统帮助「找到」合适打开这个文件的方式。Windows 系统会根据文件扩展名部分,在一个数据库中查找「可以打开这个扩展名文件的程序」,譬如 .doc 可以用 Word 打开,那么用户在双击一个 .doc 文件的时候,系统会自动启动 Word 程序,并通知 Word 去加载这个文件。OS X 一方面参考文件的扩展名,一方面会参考文件的属性(可执行权限)和文件内容(magic bits)去寻找合适的做法。

从这里可以看出,Windows 系统在打开一个文件的时候,只根据文件名中的扩展名就可以找到对应的程序。第一段中的例子

int main() { return 0; }

如果被命名为 hello.c,则系统可以调用 Visual C++ 打开;而如果命名为 hello.txt,则系统会调用记事簿打开。

这也就是为什么会有人认为,为什么改了一个文件的扩展名是更改了这个文件的类型。实际上发生了变更的只是这个文件在系统中的默认打开方式;如果文件本身内容不符合程序对文件内容格式的预期,仍然是会出错的。

同时,如果有几个扩展名都默认使用同一个程序打开,则文件扩展名与文件格式不符的情况能否正确打开取决于程序本身。如我将一个 .jpg 文件的扩展名改为 .png,而两者默认打开方式都是某图像浏览器,则系统仍然会调用这个图像浏览器打开这个文件;而这个浏览器是否对文件内容和扩展名不匹配的情况作出兼容处理还是报错,则完全取决于程序本身。

Windows 用户有一个「令人震惊」的习惯,即:右键单击桌面 -> 新建 -> 新建文本文件,然后将文件名改为 xxx.doc,双击打开。这个操作实际上只是提示 Word 去打开这个文件;而 Word 恰好对于一个刚创建的,内容完全为空(一个字符都没有)的伪?doc 文件不报错而已。这种「兼容性」实际上误导了许多人对「文件名」和「文件格式」这个基本概念的理解。

-

【bombless的回答(3票)】:

首先,什么是文件类型?

一个文件就是一个字节流,单单从文件的角度,它是没有类型可言的。

之所以有类型的概念,是我们先确定了一个文件格式,然后根据这个格式的规范组织文件的内容(组织字节流的内容),于是产生的这个文件就是我们所定的这种文件类型了。

那么文件除了字节流还有一些内容,比如访问控制,创建时间、修改时间等。另外有一个内容就是文件名。一些系统通过文件名来标记文件格式或者说类型。也就是说,在根据一定的格式创建文件时,因为文件本身没有类型可言,我们可以在文件名上反映我们当初是根据什么格式来创建这个文件的,这样我们才能解释文件的内容。

后缀名就起到这样一个作用。后缀名是文件名的一部分,通过文件名中最后一个点号以后的部分来体现。

Excel 2007以后,微软为什么更改了文件名的后缀?其实严格来说它不必要改的,因为xls这个后缀用来标记了很多种不同的格式,除了常见的复合文档作为容器,还有HTML和XML格式的文件都被微软的一些程序以xls作为后缀。因此这个行为更多的是出于营销的考虑。

还有一个问题是Excel 2007所推崇的格式是Excel 2003所不能解析的,所以使用新的后缀名可以让人们更容易意识到这一点。

好吧,忘了回答核心的内容:改后缀名不能改变文件格式,因为文件符合怎样的格式是通过它的字节流来体现的。

【Fan的回答(2票)】:

后缀和程序互相关联,只是为了让系统知道,这个程序用什么打开罢了。

  • 比如说123.mp3可以指定酷狗打开,也可以指定foobar打开。

    假如私自更改成123.txt,那么默认就会是记事本打开,记事本不可以播放mp3文件,就会错误。

    但是如果你指定*.txt关联酷狗打开,那么这个123.txt也是可以被酷狗打开且播放的。

直接更改后缀没有改变文件类型的本质。

原文地址:知乎

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多