如何在Linux桌面中获取与文件关联的图标,MIME类型和应用程序?

时间:2009-10-27 07:11:51

标签: c++ linux mime gnome kde

在Linux桌面上使用C ++,获取图标,文档描述和应用程序与任意文件/文件路径“关联”的最佳方法是什么?

我想用最“规范”的方式在KDE和gnome上找到图标,mime类型/文件类型描述和相关应用程序,我想避免任何“炮轰”到命令行和“低级”例程以及避免自己重新发明轮子(不解析mime-types文件等)。

编辑和备注:

嘿,我最初问过关于QT文件信息对象的这个问题,并且“没有明确答案”的答案似乎是正确的。但这是一个搞砸的情况,我正在提出寻找更多信息的问题。

我不再关心QT了,我只是在寻找大多数的方法来通过KDE和gnome上的C ++ / c函数调用找到mime类型(特别是Gnome,因为那是最令我困惑的地方)。我希望能够在Gnome和Konquerer / KDE中显示与Nautilus相匹配的图标和描述,以及适当地打开文件等。

我想我可以单独为KDE和Gnome获取它。最大的问题是获取Linux桌面所有这些信息的最常见/最佳/最佳方法是什么? Gnome文档特别不透明。 gnome-vsf有mime例程,但它已被弃用,我找不到GIO / GFS的mime例程,gnome-vsf的替换。有一个模糊的暗示,人们应该使用开放的桌面应用程序,但使用哪一个是模糊的。 libmagic和xdg在哪里适合?

指向一篇总结这些问题的文章的指针很乐意接受。同样,我知道三行答案是“没有这样的动物”,但我正在寻找的答案。

9 个答案:

答案 0 :(得分:12)

以下是使用GLib / GIO获取所需信息的示例。

#include <gio/gio.h>
#include <stdio.h>

int
main (int argc, char **argv)
{
    g_thread_init (NULL);
    g_type_init ();

    if (argc < 2)
        return -1;

    GError *error;
    GFile *file = g_file_new_for_path (argv[1]);
    GFileInfo *file_info = g_file_query_info (file,
                                              "standard::*",
                                              0,
                                              NULL,
                                              &error);

    const char *content_type = g_file_info_get_content_type (file_info);
    char *desc = g_content_type_get_description (content_type);
    GAppInfo *app_info = g_app_info_get_default_for_type (
                                  content_type,
                                  FALSE);

    /* you'd have to use g_loadable_icon_load to get the actual icon */
    GIcon *icon = g_file_info_get_icon (file_info);

    printf ("File: %s\nDescription: %s\nDefault Application: %s\n",
            argv[1],
            desc,
            g_app_info_get_executable (app_info));

    return 0;
}

答案 1 :(得分:3)

您可以使用xdg中提供的工具,特别是xdg-mime query

找出例如文件类型您要

的文件index.html
$ xdg-mime query filetype index.html

这将返回mimetype。要查询与该mimetye关联的应用程序,例如

$ xdg-mime query default text/html

此处返回epiphany.desktop,即$APPNAME.desktop,因此很容易从中获取应用程序名称。如果您只想在默认应用程序中打开该文件,您当然可以运行

$ xdg-open index.html

这将引发顿悟。

图标资源的查询功能似乎在xdg-utils中不可用,但你可以使用pyxdg编写一个小的python脚本,它也提供了大量的附加功能。

对于C绑定,您可能需要查看portland页面上链接的xdg代码。

修改

关于libmagic和朋友,你需要决定你的偏好:虽然libmagic似乎在文件类型的覆盖范围方面更完整(和准确),它根本不关心关于默认应用程序或图标。它也没有为您提供安装额外mimetypes的工具。

答案 2 :(得分:3)

在Qt&gt; = 4.6中,X11系统有一个新功能

QIcon QIcon::fromTheme ( const QString & name, const QIcon & fallback = QIcon() ) [static]

您可以使用此功能。 Documentation here / (Qt 5)

答案 3 :(得分:1)

QFileIconProvider和QFileInfo都不会对OS mime数据库执行任何操作。要访问与不同mime类型关联的图标,您必须使用底层桌面环境的功能。在Qt中,(还)没有规范的方式。

考虑到你可以在Gnome,KDE和Windows中拥有不同的图标。例如,在KDE中,您将使用KMimeType

答案 4 :(得分:1)

我刚发现KFileItem。这个类为您提供KDE中的图标,mime类型和相关内容的所有内容。我确信在gnome中有一个等价物,但这可以在与QT应用程序相同的级别上进行访问。

答案 5 :(得分:0)

您可能想要使用系统的“/etc/mime.types”文件。维护程序的MIME类型文件副本也是一个好主意。这样,您不依赖于系统,但同时您需要保持相当详尽。不确定图标。

答案 6 :(得分:0)

也许看看这段代码: http://ftp.devil-linux.org/pub/devel/sources/1.2/file-4.23.tar.gz

这是大多数Linux / Unix发行版中的标准文件util。您将获得MIME类型和更多信息。

我认为Gnome和KDE都有自己的方法来确定它,并为它设置图标和标准应用程序。

无论如何,该文件工具可能是获取mime类型和文档描述的最佳方式。在某些情况下甚至还有一些关于内容的细节。

这会让你获得mime类型。无论如何,您需要知道如何打开文件。这些是分开的步骤。文件没有说明你的图标,也没有说明打开文件的应用程序。

答案 7 :(得分:0)

晚了大约8年,但仍然有用。

要在KDE中获取关联的应用程序,您可以执行Joe建议的操作(使用KFileItem)。但是,这需要包含许多库。 下面的代码要求更少。

#include <QCoreApplication>
#include <QMimeDatabase>
#include <QDebug>

#include <KMimeTypeTrader>

int main(int argc, char *argv[])
{
  QCoreApplication a(argc, argv);

  if (argc < 2)
  {
    qDebug() << "missing argument <filename>";
    return 1;
  }
  QMimeDatabase mimeDb;
  QMimeType     mimeType = mimeDb.mimeTypeForFile(QString::fromLocal8Bit(argv[1]));

  KService::List services = KMimeTypeTrader::self()->query(
      mimeType.name(),QStringLiteral("Application"));

  foreach(const QExplicitlySharedDataPointer<KService>& svc, services)
  {
    qDebug() << "service: " << svc->name();
    qDebug() << "exec: " << svc->exec();
  }
}

要编译代码,请将QT += KService KCoreAddons添加到您的qmake .pro文件中。

链接到KMimeTypeTrader和KService文档:

答案 8 :(得分:0)

复制/粘贴上面的好例子(使用 GLib/Gio)只是根据文档添加了正确释放分配的内存。我试图只编辑现有的答案,但它一直说编辑队列已满:(

#include <gio/gio.h>
#include <stdio.h>

int
main (int argc, char **argv)
{
    g_thread_init (NULL);
    g_type_init ();

    if (argc < 2)
        return -1;

    g_autoptr(GError) error;
    GFile* file = g_file_new_for_path (argv[1]);
    GFileInfo* file_info = g_file_query_info (file,
                                              "standard::*",
                                              G_FILE_QUERY_INFO_NONE,
                                              NULL,
                                              &error);

    const char* content_type = g_file_info_get_content_type (file_info);
    g_autofree gchar* desc = g_content_type_get_description (content_type);
    GAppInfo* app_info = g_app_info_get_default_for_type (
                                  content_type,
                                  FALSE);

    /* you'd have to use g_loadable_icon_load to get the actual icon */
    GIcon* icon = g_file_info_get_icon (file_info);

    printf ("File: %s\nDescription: %s\nDefault Application: %s\n",
            argv[1],
            desc,
            g_app_info_get_executable (app_info));

    g_object_unref(file_info);
    g_object_unref(file);
    return 0;
}