Windows 的文件类型与对应打开程序的关联,与 Linux 系统一致,依旧可以遵照三个基本问题展开:
- 各种文件类型如何描述?
- 各类应用程序如何描述?
- 文件类型与读取打开其的应用程序的关联机制如何设计?
文件类型描述
Windows 文件类型遵照的核心标准与 Linux 一致,都是 MIME 规范。
MIME 规范是最初源起于 Internet 的一套文件类型规范,一个新的文件类型想成为正式的 MIME 类型,必须向 IANA 注册,有一套规范的过程、规则和对应的模板。
(定义了 MIME 类型,本质上确定了该文件内部的数据结构)
在 Windows 具体实现中,以文件扩展名作为文件类型的区分。这一点是与 Linux 的巨大不同,Linux 系统不用文件扩展名作为文件类型,所以 Linux 中看到一个文件名,无法直观判断其类型。
应用程序描述
Windows 的应用程序采用 PE 文件结构,以扩展名 exe 形式呈现。
文件类型与应用程序关联机制
Linux 中采用系统中的 .list 文件形式将文件类型与应用程序进行关联。Windows 中,采用注册表中的键值将文件类型与应用程序进行关联。
在 Windows 注册表中,主要由 HKEY_CLASSES_ROOT
根键完成关联机制的建立。
在 Windows 用户图形界面下,每件事、每个文件、每个目录、每个小程序、每个连接、每个驱动都被看做一个对象,每个对象都有确定的属性和它联系。HKCR包含着对象类型和他们属性的列表。
HKCR主要功能包括:
- 一个对象类型和一个扩展名关联;
- 一个对象类型和一种图标关联;
- 一个对象类型和一个命令行动的关联。
- 定义对象类型相关菜单选项和每一个对象类型属性选项。
1. 在注册表中注册文件类型
在 Windows 中,以文件扩展名作为文件类型区分,任何扩展名的文件(如.abc文件)想在 Windows 系统中使用,首先都是要在注册表中注册该扩展名,让该扩展名在系统中“挂上号”。
具体实现上,在注册表根键 HKEY_CLASSES_ROOT
中,需建立该扩展名(.abc)的子键,代表一个文件类型在系统中的确立。利用该键的默认值项,可以定义该扩展名的文件的类型名称。如 abcfile。此外,还可以在该扩展名的键中,利用 Content Type 值项明确该扩展名对应 MIME 类型,真正建立扩展名与 MIME 类型的联系。
(MIME 类型本质就是对文件内部数据结构的确立,使用 Content Type 值项的命名非常贴切)
2.建立文件类型与应用程序的关联
- 完成基于扩展名的注册后,同样在根键
HKEY_CLASSES_ROOT
下,建立以步骤 1 中扩展名子键中默认值项中定义文件类型名称(abcfile)的命名的子键,并在该子键下逐级创建子键 shell、open、command。 -
在 command 子键的默认值项中,填入该文件类型的打开程序路径。
如此,即可在 Windows 中建立一个特定扩展名文件与其对应打开程序的之间的关联。当双击扩展名文件时,注册表中即可找到对应应用程序予以打开。
reference:
- https://blog.csdn.net/u012562943/article/details/77503299
- File Association Example(Microsoft Document)