Linux下文件关联的实现原理

我们知道在 Windows 下,双击一个可执行文件,文件管理器会自动运行这个应用程序。而双击一个数据文件时,文件管理器会用与之关联的应用程序打开它。数据文件与应用程序之间的关联是通过注册表来实现的:文件管理器查询注册表,找到数据文件对应的应用程序,然后运行这个应用程序,并把数据文件的文件名作为命令行参数传给它。

这种文件关联的方式非常好用,省去了先起动应用程序再打开文件的麻烦。 Linux 下的桌面环境也有类似的功能,而且实现方式更合理。最近负责开发一个资源管理器,本来 GNOME 有一个功能强大的资源管理器 Nautilus ,只是它过于庞大,不但有超过 10 万行的代码,还依赖于 libgnome 、 gnome-vfs 和 CORBA 等,故不适合于嵌入式应用。最终我们决定自己开发一个简化的资源管理器,但又要尽量兼容现有的应用程序,这要了解相关标准,文件关联方式是其中之一。把这几天学到的知识做个笔记吧,供有兴趣的朋友参考:

首先让我们看看文件关联要做些什么。
1. 数据文件与应用程序的关联。一个应用程序通常只能打开一些特定的数据文件,比如图片浏览工具可以打开 PNG 、 BMP 和 JPEG 等图片文件。打开一词的意义比较宽泛,这里包括:打开、播放、安装、编辑和打印等等。

2. 文件类型信息。资源管理器把数据文件列出来时,通常会用一个图标来标识这类文件,同时也会加上一个简短的名称,以便用户可以很容易把它与其它类型的文件区分开来。

下面我们看看 linux 下是如何实现的。
1. 判断文件类型。文件的数量是无限的,我们只能按文件类型来处理。如何判断一个文件所属的文件类型呢?可能有人会说,很简单,用扩展名区分就行了。没错,用扩展名可以做到,但这种方法有两个缺陷:一方面它不是很精确,相同扩展名的文件的类型可能完全不同,比如 dat 文件,可能是一个视频文件,也可能是一个普通数据文件。另一方面它不是很准确,扩展名可以任何改动,为了某种目的,完全可以把 exe 扩展名改为 htm 扩展名。

而且在 Linux 下扩展名只是一个可选项,很多文件根本没有扩展名,所以纯粹采用文件扩展名的方式来判断肯定是不行的。为了更好的判断文件类型,在 linux 下同时采用两种方式:优先采用 magic 方式,其次才采用文件扩展名方式。所谓 magic 方式,就是根据文件内容来判断。绝大多数文件,内部都有一些特定的标记,这些标记称为 magic ,比如 BMP 图片文件以 BM 两个字符开头, BM 就是一个 magic 。虽然即使采用了双保险机制也有误判的可能,但概率已经大大降低了。

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

3. 文件类型的数据信息。
在 linux 下,关于文件类型的信息通常放在 /usr/share/mime 、 /usr/local/share/mime 和用户目录下,所有应用程序可以共享这些信息。在该目录下,一般会有以下这些文件:
l aliases :文件类型的别名。比如 application/pdf 有时也称为 application/x-pdf 。
l magic :各种文件的内部标识,用于从文件内容来判断文件类型。如 BMP 图片文件以 BM 开头。
l globs :扩展名与文件类型的对应关系。如 *.cpp 文件是 text/x-c++src 类型的。
l packages 目录:用于安装新文件类型用。
l 其它子目录及其下的文件:更详细的描述各种文件类型。比如 image 下的 jpeg.xml 文件描述了 jpeg 文件类型。为了方便国际化,这些描述信息有各种语言版本。

4. 图标文件与数据文件的关联。
在资源管理器中,通常用不同的图标来区分不同的文件类型。同时图标也是桌面主题相关的,主题不同,图标的大小和外观也不一样。图标文件通常存放在 /usr/share/icons/ 主题 / 大小 /mimetypes 目录下。

文件类型与图标文件的对应关系是通过文件名来实现的。比如, JPEG 文件对应的图标文件为 gnome-mime-image-jpeg.png 。
( 这块不是很确定,有待进一步研究 )

5. 应用程序与数据文件的关联。
应用程序与数据文件的关联是通过 .desktop 文件来实现的。应用程序要出现在开始菜单中或者桌面上,它要提供一个 desktop 文件才行。应用程序安装之后, desktop 文件通常安装到 /usr/share/applications 下。

可以在 desktop 文件中,指明其可以操作的文件类型。如,软件包安装程序可以操作 rpm 文件,它的 desktop 文件 (system-install-packages.desktop) 内容为:
[Desktop Entry]
Name=Install Packages
GenericName=Install Packages
Comment=Install new packages on the system
MimeType=application/x-rpm;
Exec=/usr/bin/system-install-packages %F
Terminal=false
Type=Application
Icon=system-config-packages.png
Encoding=UTF-8
NoDisplay=true

MimeType 项指明它可以操作 rpm 类型的文件。

Linux 比 windows 的做法科学之处。
1. Linux 采用了双保险机制,对文件类型的判断更正确,出错的概率更小。

2. Linux 分离文件类型判断信息和文件关联方式,这样文件类型信息可以被重用。比如 file 命令可以用这些信息来判断文件类型,而不必打开它。

参考资料:
http://standards.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-0.13.html
http://www.freedesktop.org/wiki/Standards_2fAddingMIMETutor

~~end~~
原文地址: http://blog.csdn.net/absurd/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值