Linux下的文件关联与图标关联

Windows下文件关联是使用注册表实现的,那么Linux下是如何实现的呢?本文主要说明Linux下实现文件与可执行的程序的关联以及文件与相应的显示图标的关联的机制。

1 linux文件类型判断

在Windows下,一般只使用扩展名来区分文件类型,不过种方法并不够精确,相同的尾辍可能会代表不同的数据文件,另外扩展名也是较容易修改的。在Linux下,则不仅仅使用扩展名来判断文件的类型,首要的判断机制是一种叫作magic方式。
magic方式实质上就是通过文件的内容进行判断,大多数的文件内部都会有特定的标记,可称这些标记为magic,如同样的文本类型,即使没有扩展名的情况下,Linux仍然可正确区分bash脚本和C语言的源文件。
Linux同样也会采用扩展名作为判定文件类型机制,这种双重机制使得Linux能够有较高的准确度的判断率。

2 文件类型的表示

文件类型如何表示呢?我们说JPEG是图片文件,说txt是文本文件,WML是XML文件。这种分类很直观,但也有几个问题:对JPEG文件来说,称它图片文件太笼统了。有的图片浏览工具虽然能够打开大部分图片文件,但不一定能打开所有图片文件,它需要更详细的文件类型信息。对txt和WML来说,它们其实都是文本文件,有的编辑器可能以同样的方式处理它们。为了避免分类太细或者太粗,linux采用了MIME(可以参考相关RFC)规范,它用一种层次型的方式来分类,如:

JPEG文件:image/jpeg
文本文件:text/plain
XML文件:text/xml

这种分类方式就可以粗细兼顾了。
Linux下查看文件类型的方法:

$ mimetype --all filename

这种一般显示若干个类型,其中最上面的类型可认为是优先级最高的类型,即默认类型。

3 文件类型数据信息

在linux下,关于文件类型的信息通常放在/usr/share/mime、/usr/local/share/mime和用户目录下,所有应用程序可以共享这些信息。在该目录下,一般会有以下这些文件:

aliases:文件类型的别名。比如application/pdf 有时也称为application/x-pdf 
magic : 各种文件的内部标识,用于从文件内容来判断文件类型。如BMP图片文件以BM开头。
globs : 扩展名与文件类型的对应关系。如*.cpp文件是text/x-c++src类型的。
packages目录: 用于安装新文件类型用。

4 图标与类型的关联

事实上,文件类型名和图标是通过图标的名称相关联的。
以docx为例:

$ mimetype --all ./filename.docx
./filename.docx: application/vnd.openxmlformats-officedocument.wordprocessingml.document
./filename.docx: application/zip
./filename.docx: application/octet-stream

可以看出docx的文件归属到三种类型,其中最优先的类型是:application/vnd.openxmlformats-officedocument.wordprocessingml.document
故图标的名称即为:

application-vnd.openxmlformats-officedocument.wordprocessingml.document.svg

其中svg是为矢量图标类型,可以换成jpg,png之类的。
而对于应用类型的图标主要放在/usr/share/icons/hicolor/以及~/.local/share/icons/hicolor相应的目录下。
对于这些图标的寻找顺序和优先级还不甚明了,但是根据一般的情况应该是个人用户下优先,系统图标优先。

5 应用程序与文件的关联

应用程序与数据文件的关联是通过.desktop文件来实现的。应用程序要出现在开始菜单中或者桌面上,它要提供一个desktop文件才行。应用程序安装之后,desktop文件通常安装到/usr/share/applications下。不过对于非root用户来说,一般也可是安装到~/.local/share/applications目录下。而其中与文件类型关联比较密切即为mimetyp先项。

6 应用范例

6.1 实现目标

为了一个只能终端打开的程序(Xopen)关联上一种文件类型(.xdc),并为该类型制作特别的文件图标以及给序该程序赋予一个启动图标。
需要准备的文件有:

1. Xopen 应用程序,后面能够接文件名,打开filename.xdc文件
2. filename.xdc xdc文件
3. Xopen.png 用于应用程序的图标(可以为.jpg)
4. 128x128 64x64 32x32 16x16等各种不同分辨率的图片,用于制作文件类型图标

6.2 添加文件类型

首先查看一下filename.xdc的文件类型:

$ mimetype --all filename.xdc
filename.xdc: text/plain

可以看出Linux认为filename.xdc就是一个纯文本文件,当然了,无论它是认为这个是什么类型的文件都没有关系。
之后在~/.local/share/mime/packages目录下新建文件:x-open-xdc.xml,文件类型如下:

<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
 <mime-type type="application/x-open-xdc">
  <comment>html document</comment>
  <glob pattern="*.xdc"/>
 </mime-type>
</mime-info>

可以看出上面文件中将新的文件类型命名为:application/x-open-xdc,而辨认的方式则采用的扩展名,*.xdc。这样就成功的将文件名和相关的文件类型绑定了起来。但这样还能生效,需要更新一下mime的数据库:

$ update-mime-database ~/.local/share/mime

更新完成之后,再看看filename.xdc的文件类型:

$ mimetype --all filename.xdc
filename.xdc: application/x-open-xdc
filename.xdc: text/plain

很明显,已成功的将相应的扩展名与类型联系在一起。

6.3 文件类型与相应的图标的关联。

由于关联的方式是采用相应的小图标的文件名,所以可以将相应的各种分辨率的图标分配到相应的文件夹中,在本例中,即可将图片命名为applicaton-x-open-xdc.png,然后分别分配到~/.local/share/icons/hicolor相应的目录下。
分配之后不会立即生效,需要注销或者重启才会起作用。

6.4 文件类型与相应的程序相关联

在~/.local/share/applications/的添加名为xopen.desktop文件,内容如下:

[Desktop Entry]
Name=Xopen
GenericName=Xopen
Comment=Xopen
MimeType=application/x-open-xdc;
Exec=xopen %F
Terminal=false
Type=Application
Icon=/home/username/Xopen.png
Encoding=UTF-8

其中MimeType就是指明了该应用程序xopen与类型application/x-open-xdc的关联,而Icon则指向应用程序的图标。当然不要忘记加上可执行的权限。
这样就完成了整个文件类型与应用程序的相关联,一般情况下,就可以使用右键filename.xdc即可选择到相应的程序,并设置成默认的启动程序。

参考文献

  1. Shared MIME-info Database
  2. Linux下文件关联的实现原理
此条目发表在LINUX分类目录,贴了标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。