`
jspengxue
  • 浏览: 178463 次
  • 性别: Icon_minigender_1
  • 来自: 天堂和地狱的中间
社区版块
存档分类
最新评论

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和用户目录下,所有应用程序可以共享这些信息。在该目录下,一般会有以下这些文件:

1         aliases:文件类型的别名。比如application/pdf 有时也称为application/x-pdf 。

2        magic:各种文件的内部标识,用于从文件内容来判断文件类型。如BMP图片文件以BM开头。

3         globs:扩展名与文件类型的对应关系。如*.cpp文件是text/x-c++src类型的。

4         packages目录:用于安装新文件类型用。

5        其它子目录及其下的文件:更详细的描述各种文件类型。比如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命令可以用这些信息来判断文件类型,而不必打开它。



分享到:
评论

相关推荐

    文件系统挂载和管理工具

    通过linux的开机原理来了解文件系统 1.关于根文件系统 linux开机原理图,可以看到图中的根文件系统是系统开机之后被识别到的,并挂载上去。 2.linux启动后文件系统情况 [1]除了根文件系统,其他分区都需要mount命令...

    Matlab工具箱,用于通过互相关环境地震噪声和测量时移来估计格林函数_MATLAB_代码_相关文件_下载

    此外,还包括用于准备、处理和交叉关联输入数据的子功能,以及用于分析、反转和绘制结果的辅助功能。输入值均已定义并可在设置文本文件中更改,因此只需指定设置文件的名称作为主函数的输入。 大多数函数是用 ...

    基于Hadoop&amp,Spark的关联规则实践+源代码+文档说明

    > 此次实践主要目的在于,希望通过亲身实践,加深自己对Hadoop、Spark两类大数据工具的理解,熟悉其从集群部署到运作的基本流程,了解FPGrowth算法的基本原理,掌握算法在关联规则中的基本应用,为日后的大数据学习...

    基于android平台的嵌入式手机MP3的设计与实现

    的工作原理,介绍了MP3文件的结构及MP3文件的解码流程。在对以上的理论基础进 行讨论后,详细的介绍了Android手机开发平台的开发环境。之后对基于Android手机 平台的MP3播发器系统做了一个详细的需求分析。在需求...

    wireshark源码

    为了编译解析器并创建插件,还需要在解析器代码文件"packet-rdp.c"所在目录下创建一些提供支持的文件: - Makefile.am - UNIX/Linux的makefile模板 - Makefile.common - 包含了插件文件的名称 - Makefile.nmake - ...

    1000道 互联网Java架构师面试题.pdf和JAVA核心知识整理.zip

    如果支持,它的实现原理是什么? 23、Mybatis 的一级、二级缓存 24、什么是 MyBatis 的接口绑定?有哪些实现方式? 25、使用 MyBatis 的 mapper 接口调用时有哪些要求? 26、Mapper 编写有哪几种方式? 27、...

    UNIX操作系统教程 张红光

    Window编程环境介绍295 14.2数据检索加工工具awk296 14.2.1awk基本描述296 14.2.2awk中的记录和字段297 14.2.3awk中使用的模式298 14.2.4awk中的...Linux系统中的C环境308 附录CUNIX/Linux常用命令314 参考文献...343

    php自动生成带图片附件的doc文档类

    原理解释:doc文件保存插入图片的原理是新增一个 .files文件夹(用word程序打开修改doc文档后,添加的ole文件也是自动会将资源保存在.files文件夹中。) 注意:强烈建议路径文件夹表示采用linux系的/而非windows系的\...

    传智播客扫地僧视频讲义源码

    20_文件加密案例_文件搬运实现 21_文件加密案例_文件加密功能集成 22_文件加密案例_文件加密实现 23_作业 24_学员二级指针代码bug调试_传智扫地僧 源码及文档 01_课程回顾 02_解密作业 03_指针用法杂项 04_再谈多级...

    Qt5.9 c++开发指南.zip

    例如,在第2章“GUI应用程序设计基础”里先介绍了用Qt Creator设计的.ui文件的原理,应用程序如何由.ui文件自动创建界面,再介绍手工代码创建界面的原理,搞清楚两种方法的关联之后,再介绍混合方式灵活设计UI界面。...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    在Qt Creator 的安装目录的qt 文件下的bin 文件夹下(我安装在了D 盘, 所以路径是D:\Qt\2009.04\qt\bin),可以找到所有的相关.dll 文件。在这里 找到mingwm10.dll 文件,将其复制到C:\WINDOWS\system 文件夹下,...

    04735--数据库系统原理.doc

    数据库系统原理 课程代码:04735 一、单选题 1、( C )是描述事物的符号记录,是数据库中存储的基本对象。描述事物的符号可以是数字,也 可以是文字、图形、图像、声音、语言等。数据有多种表现形式,它们都可以经过...

    04735--数据库系统原理(1).doc

    数据库系统原理 课程代码:04735 一、单选题 1、( C )是描述事物的符号记录,是数据库中存储的基本对象。描述事物的符号可以是数字,也 可以是文字、图形、图像、声音、语言等。数据有多种表现形式,它们都可以经过...

    精通Qt4编程(第二版)源代码

    \蔡志明首次引入Qt设计器的使用,绘制并实现了一个查找文件功能的部件,介绍了Qt应用程序中使用ui文件的基本方法以及Qt样式表;较深入地分析了Qt对象模型的一些基本知识,涉及信号和槽机制、Qt元对象系统、属性系统...

    精通qt4编程(源代码)

    \蔡志明首次引入Qt设计器的使用,绘制并实现了一个查找文件功能的部件,介绍了Qt应用程序中使用ui文件的基本方法以及Qt样式表;较深入地分析了Qt对象模型的一些基本知识,涉及信号和槽机制、Qt元对象系统、属性系统...

    python入门到高级全栈工程师培训 第3期 附课件代码

    01 selctors实现文件上传与下载 02 html的介绍 03 html文档树的概念 04 meta标签以及一些基本标签 05 img标签和列表标签 06 form表单之input标签 07 通过form向server端发送数据 08 form表单之select标签 09 table...

    java 面试题 总结

    但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...

    自己动手写操作系统(含源代码).part2

    我们有许多源代码公开的操作系统,可供随时下载和阅读,看上去好像让实现一个供自己把玩的微型操作系统变得容易很多,但事实往往不尽人意,因为这些代码动辄上万甚至几十几百万行,而且细节之间经常互相关联,要...

Global site tag (gtag.js) - Google Analytics