Linux: Shared MIME
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相关推荐
- linux 添加mime类型,Linux MIME type
什么是MIME Type MIME Type是用于描述文件的类型的一种表述方法,其将文件划分为多种类型,方便对其进行统一的管理. MIME Type指定了文件的类型名称.描述.图标信息,同时通过与.d ...
- linux 内存 shared,Linux Shared Memory的查看与设置
Linux Shared Memory的查看与设置 共享内存就是进程之间可以共享的一段内存,通过一个唯一的KEY值绑定 shmget()创建或获取 shmat()连接 shmdt()断连 共享内存的访 ...
- linux shared,从 0 开始学习 Linux 系列之「22.共享内存 Shared Memory」
共享内存 版权声明:本文为 cdeveloper 原创文章,可以随意转载,但必须在明确位置注明出处! 共享内存 Shared Memory 这次我们来学习在 Linux 中最快的一种 IPC 方式:共 ...
- Nginx(十八)mime.types的作用
一 MIME简介 了解 ++++++++++++'MIME简介'++++++++++++1)全称'Multipurpose Internet Mail Extension(多用途因特网邮件扩展) ...
- Load-time relocation of shared libraries
E原文地址:http://eli.thegreenplace.net/2011/08/25/load-time-relocation-of-shared-libraries/ This article ...
- 嵌入式linux和嵌入式android系统有什么区别和联系?
转自:http://bbs.eeworld.com.cn/thread-430437-1-1.html 这个问题很多人问,尤其是初入嵌入式的菜鸟.其实大家都认为android是java,已经不是lin ...
- linux系统中 库分为静态库和,Linux系统静态库与共享库
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? This article mainly introduces the statics library and share ...
- 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 ( ...
- Kali Linux渗透测试 093 自动注入-Sqlmap
本文记录 Kali Linux 2018.1 学习使用和渗透测试的详细过程,教程为安全牛课堂里的<Kali Linux 渗透测试>课程 Kali Linux渗透测试(苑房弘)博客记录 1. ...
最新文章
- POJ1236 强连通 (缩点后度数的应用)
- openssh实现key验证免密码登录
- IntelliLight: a Reinforcement Learning Approach for Intelligent Traffic Light Control 论文阅读
- idea 编译显示source1.3不支持泛型(请使用source5或更高版本)
- java数据库编程——执行SQL 语句
- 教你Mac电脑复制手机粘贴的隐藏玩法
- Java之收集很好的Java学习资料地址+博客
- CTS(12)---android 兼容性测试 CTS 测试过程
- 谁在让字节跳动?张一鸣领衔14大将,106位高管架构首次曝光
- 基于相关向量机RVM的分类算法
- 简易sql词法分析器和语法分析器
- MTK最新工具(刷机,写号,升级等)合集含工具源码
- java ssm进销存源码,ssm进销存流程管理系统
- 认识网络号与子网划分
- 中国人民银行面试题目(经典题目2)
- NCE4 L3 Matterhorn man
- 浅浅轻吟如花的芬芳,开始散漫着
- 回溯、图论——最大团问题(求最大完全子图)
- 设计企业任务管理系统,阿米巴效率工具,工时管理
- 【数据压缩(四)】c语言实现BMP序列转YUV文件并播放
热门文章
- mysql无法输入数据库_关于mysql数据库无法录入中文的问题
- 车载wince系统刷界面ui_UI入门秘笈,你想知道吗?
- python pip install pillow_Windows下Python中pip安装Pillow报错总结(转载)
- linux make项目管理器,Linux中makefile项目管理
- 用crt连接远程linux,在windows下secureCRT远程安全连接linux
- 2020计算机大纲,计算机专业2020考试大纲.doc
- android网格布局间距,android – 删除回收站视图网格布局中的默认间距
- call和calling的用法_call的用法及短语例句
- vim python 代码提示_linux vim 编写代码python使用tab补全
- apollo 配置中心小结