我们知道在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. **Superblock(超级块)**:超级块包含文件系统的元数据信息,例如文件系统类型、块大小、空闲块数量等。它是文件系统的一个关键组成部分,对于文件系统的正常运行至关重要。...
本文将深入探讨Linux虚拟文件系统的基本原理、实现细节及其对物理文件的管理机制。 #### 1. Linux VFS基本原理 **1.1 Linux所支持的文件系统的一般结构** Linux继承了Unix的设计理念,即将文件名和文件控制信息...
Linux虚拟文件系统(Virtual File System,简称VFS)是Linux操作系统中的一项核心功能,它提供了一种抽象层,使得Linux内核可以与多种不同的物理文件系统进行交互,而无需了解这些文件系统的具体实现细节。...
总的来说,使用C语言在Linux下实现HTTPS请求涉及到了网络编程和加密技术的结合,需要理解SSL/TLS协议的工作流程,以及如何使用OpenSSL库进行实际操作。通过以上步骤,你可以构建一个简单的HTTPS客户端,实现与服务器...
在这个项目中,我们关注的是一个使用C语言实现的文件系统,该系统特别设计为在Linux环境下编译运行。对于初学者来说,这是一个很好的实践平台,能够帮助他们深入理解文件系统的运作原理。 在Linux操作系统中,文件...
在本项目中,"模拟Linux文件系统"是一个学习任务,旨在通过C++编程语言来实现一个简化版的文件系统,让学生能够理解Linux操作系统中的文件系统工作原理。这个项目可能包括了文件的创建、读写、删除等基本操作,以及...
- `MAP_ANONYMOUS`:匿名映射,映射区不与任何文件关联。 - `MAP_NORESERVE`:不为映射预留交换空间。 - **fildes**:有效的文件描述符。若使用 `MAP_ANONYMOUS` 标志,该值通常设为 `-1`。 - **off**:被映射对象...
通过阅读这些文档,你可以更深入地理解Linux文件系统的工作原理,提升在Linux环境下的系统管理技能。 总之,Linux文件系统精通不仅意味着理解基本概念,还包括掌握实际操作技巧,这对于任何Linux用户,尤其是...
本篇文章将深入探讨“模拟Linux文件系统”的相关知识,主要涉及Linux文件系统的结构、工作原理以及如何通过编程来模拟这一系统。 首先,我们了解Linux文件系统的层次结构。在Linux中,一切皆为文件,包括硬件设备、...
在这个课程设计中,我们将深入探讨Linux文件系统的实现原理,并通过模拟源代码的方式进行学习。这份"Linux文件管理系统模拟源代码"旨在帮助学生理解文件系统的工作机制,为理解和编写相关软件打下坚实基础。 首先,...
通过深入研究这个“linux文件管理系统源代码”,开发者不仅可以理解Linux内核的工作原理,还能学习到如何优化文件系统的性能,甚至可以开发自己的文件系统模块。这是一份宝贵的教育资源,对于那些希望在Linux系统...
本篇将深入探讨嵌入式Linux环境下如何实现TCP文件传输,并结合"client1"和"server1"这两个文件,来阐述TCP编程的基本概念和实践步骤。 首先,TCP编程主要包括客户端(client)和服务器端(server)两部分。在嵌入式...
通过这个课程设计,学生不仅可以掌握Linux文件系统的基本原理,还能通过实践提升编程能力,理解操作系统内核的复杂性,并且能更好地理解和解决实际系统中的问题。源代码的分析和调试将提供宝贵的实践经验,为未来在...
Linux的虚拟文件系统(Virtual Filesystem Switch,简称VFS)是操作系统的核心组件之一,它为上层应用程序提供了一个统一的接口来访问各种不同类型的文件系统,如ext2、jffs等。VFS的设计目标是使得不同的文件系统...
- **重定向**:在C实现的shell中,你需要处理`>`和`符号,将文件描述符与输入/输出流关联起来,从而实现数据流向的控制。例如,你可以创建新的文件或将输出追加到现有文件,或者从文件读取输入而不是从键盘。 - **...
7. **多平台支持**:虽然这里提到的是Windows环境下的文件关联,但类似的概念也存在于其他操作系统中,如Mac OS的 Launch Services 和Linux的MIME类型。跨平台的编程需要考虑不同系统对文件关联的处理方式。 8. **...
接下来,利用`losetup`命令将一个循环设备与这个文件关联起来,让文件看起来像一个块设备而不是文件系统中的普通文件: ``` $ losetup /dev/loop0 file.img ``` 此时,`file.img`文件就以块设备的形式出现在系统中...
在Linux环境下进行文件传输是一个常见的任务,这通常涉及到网络编程中的客户端-服务器模型。本文将深入探讨如何在Linux系统中实现文件的上传和下载,尤其是使用C语言编写一个简单的文件传输项目。 首先,我们需要...
总的来说,使用C语言在Linux下实现FTP服务器涉及网络编程、文件操作、并发处理等多个领域的知识,是一个挑战性的项目,但也是学习和提升技能的好机会。通过这个过程,开发者不仅可以掌握服务器开发的基本技能,还能...