2019独角兽企业重金招聘Python工程师标准>>>

不管是在windows上面还是在Linux发行版上面,经常会遇到多个软件都可以打开同一种格式的文件,但是仔细想你会发现他们都有一个叫做 default application的东西,用来指定打开该格式的默认软件是哪个(比如我们双击一个.jpg文件这种情况就会使用设置的默认的软件).但是究竟是怎么实现的呢?

我们这里不管别的只针对deepin做讨论:

deepin使用的是Arch Linux的shared mime来做的,什么是shared mime?

MIME types:

1,在给每种文件设置default application的时候,该文件具体属于什么类型,必须是可以被检测到的通常有2种方式:

1),  通过文件后缀: .jpg, .html等等.

2), 使用 magic number.

但是很可能出现一个文件的类型对应几个不同的magic number 和 后缀的情况,这个时候就比较难办了.

于是推出了MIME types, 它可以清楚的指明一个文件的类型.

MIME database:

1, 操作系统维护一个公认的MIME types的数据库( Shared MIME-info Database):

1), 该database是通过/usr/share/mime/packages 或者 ~/.local/share/mime/packages 这个两个文件夹下面的.xml文件,使用 shared-mime-info包生成的.

2), 我们可以在该 /usr/share/mime/packages 或者 ~/.local/share/mime/packages  文件夹下面 放入我们自定义的 MIME types的 .xml文件.

注册我们的自定义类型.

3), 通过shared-mime-info包生成的 Shared MIME-info database被放在 /usr/share/mime 或者 ~/.local/share/mime下面. 特别需要注意的是database文件并不是需要我们来维护的, 如果我们想注册我们的自定义类型是不需要修改database文件的.

只需要:

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

或者

update-mime-database  /usr/share/mime

我们以笔者电脑 /usr/share/mime/packages/Nokia-QtCreator.xml为例子:

<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info"><!-- Mime types must match the desktop file associations --><mime-type type="application/vnd.nokia.qt.qmakeprofile"><comment xml:lang="en">Qt QMake Profile</comment><glob pattern="*.pro"/></mime-type> <!-- Note: KDE already has application/x-designer. --><mime-type type="application/vnd.nokia.xml.qt.resource"><comment xml:lang="en">Qt Resource File</comment><glob pattern="*.qrc"/></mime-type> </mime-info>

本来MIME types是不支持 .pro文件 以及 .qrc文件的,这个时候我们就可以通过按照标准的格式写一个 .xml文件放入到 /usr/share/mime/packages 下面, 然后通过: update-mime-database /usr/share/mime. 把我们想要支持的类型注册进去就好了.

Desktop Entry:

上面的工作使得系统可以分辨出来我们的自定义类型了, 但是问题也随之来了,什么app支持该类型呢?  我们应该如何指定一个app支持该类型呢?

这个时候我们就需要 .desktop文件来指定 告诉操作系统 它支持什么类型.

 notice that:  .desktop文件在  /usr/share/applications/ 或者 ~/.local/share/applications 下面.

以笔者 /usr/share/applications/qtcreator.desktop 文件为例子:

[Desktop Entry]
Exec=qtcreator %F
Icon=QtProject-qtcreator
Type=Application
Terminal=false
Name=Qt Creator
GenericName=Integrated Development Environment
MimeType=text/x-c++src;
text/x-c++hdr;text/x-xsrc;application/x-designer;
application/vnd.nokia.qt.qmakeprofile;
application/vnd.nokia.xml.qt.resource;Categories=Qt;Development;IDE;
InitialPreference=9

MimeType字段: 说明了这个程序支持的MIME types(直白点就是这个app能够打开哪些类型的文件).
Exec字段: 说明了程序的打开方式,Exec字段最后的%U或%f很重要,其决定了这个程序时候能显示在文件管理器的open with清单中.

这样以来当每次想要打开一个文件的时候获取到该文件的类型后 扫描存放 .desktop目录下的 .desktop文件就行了. 随之也带来了另外一个问题,当用户装的软件很多的时候每次扫描都会花费很多的时间.

于是 /usr/share/applications/*.desktop  和  ~/.local/share/applications/*.desktop文件被通过 desktop-file-utils 这个工具生成为:

/usr/share/applications/mimeinfo.cache

~/.local/share/application/mimeinfo.cache

方便快速查找到能够打开该类型文件的软件.

Set default application:

前面做了这么多系统终于能够识别出来我们的自定义类型了, 但是可能后来又安装了一个其他的软件也支持该类型,这可怎么办呢? 这个时候我们就需要设置一个打开该类型文件的 default application.

于是 又有了:  mimeapps.list

Path Usage
~/.config/mimeapps.list user overrides
/etc/xdg/mimeapps.list system-wide overrides
~/.local/share/applications/mimeapps.list (deprecated) user overrides
/usr/local/share/applications/mimeapps.list
/usr/share/applications/mimeapps.list
distribution-provided defaults

只需要把我们的 .desktop文件加入进去就行了.

转载于:https://my.oschina.net/SHIHUAMarryMe/blog/1524398

Linux: Shared MIME相关推荐

  1. linux 添加mime类型,Linux MIME type

    什么是MIME Type MIME Type是用于描述文件的类型的一种表述方法,其将文件划分为多种类型,方便对其进行统一的管理. MIME Type指定了文件的类型名称.描述.图标信息,同时通过与.d ...

  2. linux 内存 shared,Linux Shared Memory的查看与设置

    Linux Shared Memory的查看与设置 共享内存就是进程之间可以共享的一段内存,通过一个唯一的KEY值绑定 shmget()创建或获取 shmat()连接 shmdt()断连 共享内存的访 ...

  3. linux shared,从 0 开始学习 Linux 系列之「22.共享内存 Shared Memory」

    共享内存 版权声明:本文为 cdeveloper 原创文章,可以随意转载,但必须在明确位置注明出处! 共享内存 Shared Memory 这次我们来学习在 Linux 中最快的一种 IPC 方式:共 ...

  4. Nginx(十八)mime.types的作用

    一   MIME简介  了解 ++++++++++++'MIME简介'++++++++++++1)全称'Multipurpose Internet Mail Extension(多用途因特网邮件扩展) ...

  5. Load-time relocation of shared libraries

    E原文地址:http://eli.thegreenplace.net/2011/08/25/load-time-relocation-of-shared-libraries/ This article ...

  6. 嵌入式linux和嵌入式android系统有什么区别和联系?

    转自:http://bbs.eeworld.com.cn/thread-430437-1-1.html 这个问题很多人问,尤其是初入嵌入式的菜鸟.其实大家都认为android是java,已经不是lin ...

  7. linux系统中 库分为静态库和,Linux系统静态库与共享库

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? This article mainly introduces the statics library and share ...

  8. java调用c 返回值_推荐--Linux平台下Java调用C函数(补充关于String类型函数返回值)...

    平台介绍 系统:ubuntu10.04 jdk:Java(TM) SE Runtime Environment (build 1.6.0_20-b02) gcc:gcc version 4.4.3 ( ...

  9. Kali Linux渗透测试 093 自动注入-Sqlmap

    本文记录 Kali Linux 2018.1 学习使用和渗透测试的详细过程,教程为安全牛课堂里的<Kali Linux 渗透测试>课程 Kali Linux渗透测试(苑房弘)博客记录 1. ...

最新文章

  1. POJ1236 强连通 (缩点后度数的应用)
  2. openssh实现key验证免密码登录
  3. IntelliLight: a Reinforcement Learning Approach for Intelligent Traffic Light Control 论文阅读
  4. idea 编译显示source1.3不支持泛型(请使用source5或更高版本)
  5. java数据库编程——执行SQL 语句
  6. 教你Mac电脑复制手机粘贴的隐藏玩法
  7. Java之收集很好的Java学习资料地址+博客
  8. CTS(12)---android 兼容性测试 CTS 测试过程
  9. 谁在让字节跳动?张一鸣领衔14大将,106位高管架构首次曝光
  10. 基于相关向量机RVM的分类算法
  11. 简易sql词法分析器和语法分析器
  12. MTK最新工具(刷机,写号,升级等)合集含工具源码
  13. java ssm进销存源码,ssm进销存流程管理系统
  14. 认识网络号与子网划分
  15. 中国人民银行面试题目(经典题目2)
  16. NCE4 L3 Matterhorn man
  17. 浅浅轻吟如花的芬芳,开始散漫着
  18. 回溯、图论——最大团问题(求最大完全子图)
  19. 设计企业任务管理系统,阿米巴效率工具,工时管理
  20. 【数据压缩(四)】c语言实现BMP序列转YUV文件并播放

热门文章

  1. mysql无法输入数据库_关于mysql数据库无法录入中文的问题
  2. 车载wince系统刷界面ui_UI入门秘笈,你想知道吗?
  3. python pip install pillow_Windows下Python中pip安装Pillow报错总结(转载)
  4. linux make项目管理器,Linux中makefile项目管理
  5. 用crt连接远程linux,在windows下secureCRT远程安全连接linux
  6. 2020计算机大纲,计算机专业2020考试大纲.doc
  7. android网格布局间距,android – 删除回收站视图网格布局中的默认间距
  8. call和calling的用法_call的用法及短语例句
  9. vim python 代码提示_linux vim 编写代码python使用tab补全
  10. apollo 配置中心小结