如何在Linux桌面上获取与文件关联的图标、MIME类型和应用程序? 在Linux桌面上使用C++,获得图标、文档描述和与任意文件/文件路径相关联的应用程序的最佳方法是什么?p>

如何在Linux桌面上获取与文件关联的图标、MIME类型和应用程序? 在Linux桌面上使用C++,获得图标、文档描述和与任意文件/文件路径相关联的应用程序的最佳方法是什么?p>,c++,linux,mime,gnome,kde,C++,Linux,Mime,Gnome,Kde,我想用最“规范”的方式在KDE和gnome上找到图标、mime类型/文件类型描述和相关应用程序,我想避免任何“炮轰”到命令行和“低级”例程,以及避免自己重新发明轮子(不解析mime类型文件等等) 编辑和注释: 嘿,我最初问了一个关于QT file info对象的问题,答案是“没有明确的答案”似乎是正确的。但这是一个如此糟糕的情况,我现在开始提问,寻找更多的信息 我不再特别关心QT,我只是在寻找通过KDE和gnome(尤其是gnome)上的C++/C函数调用找到mime类型的最简单的方法,因为这是

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

编辑和注释:

嘿,我最初问了一个关于QT file info对象的问题,答案是“没有明确的答案”似乎是正确的。但这是一个如此糟糕的情况,我现在开始提问,寻找更多的信息

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

我想我可以为KDE和Gnome分别得到这个。最大的问题是,在Linux桌面上获取所有这些信息的最常见/最好/最简单的方法是什么?Gnome文档尤其不透明。gnome vsf有mime例程,但它已被弃用,我找不到GIO/GFS(gnome vsf的替代品)的mime例程。有一个模糊的暗示,一个人应该使用开放式桌面应用程序,但使用哪一个是模糊的。那么libmagic和xdg在哪里合适呢


指向一篇文章的指针,该文章总结了人们欣然接受的问题。再说一次,我知道三行的答案是“没有这样的动物”,但我正在寻找一个长答案

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


考虑一下,您可以在Gnome、KDE和Windows中使用不同的图标。例如,在KDE中,您可能需要使用系统的“/etc/mime.types”文件。维护MIME类型文件的程序副本也是一个好主意。这样,您就不必依赖于系统,但同时您需要保持它相当详尽。不确定图标。

我刚找到。这个类为您提供了KDE中图标、mime类型和相关内容的所有信息。我确信gnome中有一个等价物,但这提供了与QT应用程序工作相同级别的访问

请看一下以下代码:

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

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

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


这将获得mime类型。这就是您需要知道如何打开文件的原因。这些是分开的步骤。文件没有告诉您图标或打开文件的应用程序。

您可以使用中提供的工具,尤其是
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
中似乎不可用,但是您可以使用它编写一个小的python脚本,它还提供了大量的附加功能

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

编辑:


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

下面是一个使用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;
}
#包括
#包括
int
主(内部argc,字符**argv)
{
g_thread_init(NULL);
g_type_init();
如果(argc<2)
返回-1;
GError*错误;
GFile*file=g_file_new_用于_路径(argv[1]);
GFileInfo*file\u info=g\u file\u query\u info(文件,
“标准::*”,
0,
无效的
&误差);
常量字符*内容类型=g文件信息获取内容类型(文件信息);
char*desc=g_内容_类型_获取_描述(内容_类型);
gappingfo*app\u info=g\u app\u info\u get\u default\u用于类型(
内容类型,
假);
/*您必须使用g_loadable_icon_load来获取实际的图标*/
GIcon*图标=g_文件信息获取图标(文件信息);
printf(“文件:%s\n说明:%s\n故障应用程序:%s\n”,
argv[1],,
描述,
g_app_info_get_可执行文件(app_info));
返回0;
}

在Qt>=4.6中,X11系统有一个新功能

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

您可以使用此功能。/

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

获取K中的关联应用程序
#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();
  }
}
#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;
}