坚持QtQML,坚持移动互联网

http://www.qtcn.org/bbs/u/121778  [收藏] [复制]

toby520

将QtCoding进行到底,做Qt的宠儿

  • 89

    关注

  • 164

    粉丝

  • 3579

    访客

  • 等级:精灵王
  • 身份:论坛版主
  • 总积分:1262
  • 男,1986-11-17

最后登录:2024-04-29

更多资料

日志

如何通过代码设置文件关联功能

2013-05-13 14:57
一、需求来源
1.比如我想在右键单击后缀为.abc的文件时,open with那个列表里面能选择我的app。
2.本来存在某个应用已经关联该类型的文件,现需要修改成以我的应用为优先级的关联设置。
二、分析文件关联原理
1.Windows: Windows系统很早就加入了文件关联的功能,它大大增加了日常使用操作系统的便利性。所谓的文件关联就是指系统把指定扩展名的文件自动关联到相应的应用程序,比如.doc文件默认情况下就自动和Microsoft Word关联。当用户双击.doc文件的时候,系统会自动用Microsoft Word打开它。这篇文章将介绍怎样在Windows系统下面手动设置或者用程序自动设置文件关联。
2.Mac OSX:在文件关联和右键菜单方面,每当系统安装一个新的应用程序,都会调用 Launch Service 的 API 注册关联的文件类型。有两种情况,一种是通过 pkg 安装包安装的,通常这些应用程序会通过脚本主动向 Launch Service 注册;而第二种常见的拖拽式 .app 应用程序,则是由 Finder 和系统通过对应用程序的的一些判断后代理注册的。应用程序通过 Launch Service 注册以后,就和特定的支持文档产生了关联。
3.Linux系统各个桌面环境:
下面我们看看linux下是如何实现的。
1. 判断文件类型。文件的数量是无限的,我们只能按文件类型来处理。如何判断一个文件所属的文件类型呢?可能有人会说,很简单,用扩展名区分就行了。没错,用扩展名可以做到,但这种方法有两个缺陷:一方面它不是很精确,相同扩展名的文件的类型可能完全不同,比如dat文件,可能是一个视频文件,也可能是一个普通数据文件。另一方面它不是很准确,扩展名可以任何改动,为了某种目的,完全可以把exe扩展名改为htm扩展名。

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

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

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

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

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

5.应用程序与数据文件的关联。
应用程序与数据文件的关联是通过.desktop文件来实现的。应用程序要出现在开始菜单中或者桌面上,它要提供一个desktop文件才行。应用程序安装之后,desktop文件通常安装到/usr/share/applications下。
三、解决办法:
   1.Windows:HKEY_LOCAL_MACHINE\Software\Classes:该注册表项包括适用所有用户的默认文件关联设置;HKEY_CURRENT_USER\Software\Classes:该注册表项包含只适用当前用户的文件关联设置;除上面两个注册表项和文件关联相关外,还有另外一个非常重要的注册表项:HKEY_CLASSES_ROOT;该注册表项目里面的设置是保证Windows浏览器能够选择正确的应用程序打开相应文件的关键所在。在Windows 2000之后,该注册表项目中的文件关联设置分别存在上面所说的两个注册表项中去了。而HKEY_CLASS_ROOT 注册表项则成为融合(注意,对于相关的文件类型,HKEY_CURRENT_USER下面的设置会覆盖HKEY_LOCAL_MACHINE下面的设置)上面两个注册表项内容的一个镜像。为了更新文件关联设置,你必须更新"HKEY_CURRENT_USER\Software\Classess"或者"HKEY_LOCAL_MACHINE\Software\Classess"下的注册表项,而不是直接更新HKEY_CLASS_ROOT下的注册表项;Windows 通过代码则要修改register, 方法就比较简单了, 大家可以在网上找到答案.但是可能涉及到权限问题,某些杀毒软件会提示警告信息,不以理会即可,或者干脆卸载之。具体参考 http://www.cnblogs.com/xuguilin/archive/2011/01/09/1931169.html
  2.Mac OSX:每个mac app都有一个Info.plist文件,可以在该文件适当的地方加入
  1. <key>CFBundleDocumentTypes</key>
    <array>
    <dict>
    <key>CFBundleTypeExtensions</key>
    <array>
    <string>abc</string>
    </array>
    <key>CFBundleTypeIconFile</key>
    <string>abc.png</string>
    <key>CFBundleTypeName</key>
    <string>abc file</string>
    <key>CFBundleTypeRole</key>
    <string>Editor</string>
    <key>LSTypeIsPackage</key>
    <true/>
    <key>NSPersistentStoreTypeKey</key>
    <string>XML</string>
    </dict>
    </array>

   Launch Service 隶属于 Application Service Framework (包含一堆的应用程序接口,开发者可以通过这些接口,调用系统服务),用于使一个运行中的程序,能够打开另一个程序,文档,URL的接口。它可以打开另一个程序;在另一个程序中打开文档或URL;找到对于一个文档或URL最适用的程序;为一个应用程序注册它可以关联的文档类型和URL;获得一个文件,URL等正确的显示方式,比如如何显示此类文件的图标以及信息等;维护和更新最近试用过的最近试用程序和文档的列表。
  由于mac 文件关联比较复杂,如果是基于Qt开发的应用要想设置文件关联可能需要花费一番功夫。具体信息参考:http://maoa.cn/?sort=45Launch Services Programming Guide
    3.Linux:可以在desktop文件中,指明其可以操作的文件类型。如,软件包安装程序可以操作rpm文件,它的desktop文件(system-install-packages.desktop)内容为:
  1. [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类型的文件。
参考文章:http://blog.csdn.net/absurd/article/details/1146066
                    http://ninehills.info/2011/12/01/linux-default-program.html






分类:Mac OS X|回复:2|浏览:2547|全站可见|转载
 
 
删除

cavendish:建议加一下Linux的,例如主流的GNOME 2,3  KDE 3, 4

2013-05-13 20:33 -

toby520:对linux下的文件关联需要再研究下

2013-05-14 08:52

Powered by phpwind v8.7 Certificate Copyright Time now is:04-30 00:30
©2005-2016 QTCN开发网 版权所有 Gzip disabled