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

2024-11-14 08:30:00
admin
原创
277
摘要:问题描述:在 Linux 桌面上使用 C++,获取与任意文件/文件路径“关联”的图标、文档描述和应用程序的最佳方法是什么?我希望使用最“规范”的方式在 KDE 和 gnome 上查找图标、mime 类型/文件类型描述和相关应用程序,并且我希望避免任何“转到”命令行和“低级”例程,以及避免自己重新发明轮子(不解...

问题描述:

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

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

编辑和注释:

嘿,我最初问这个问题是关于 QT 文件信息对象的,答案是“没有明确的答案”,就目前而言似乎是正确的。但这是一个如此混乱的情况,我提出这个问题是为了寻找更多信息。

我不再特别关心 QT,我只是在寻找通过 KDE 和 gnome 上的 C++/c 函数调用来查找 mime 类型的规范方法(尤其是 Gnome,因为那里的东西最让我困惑)。我希望能够在 Gnome 上显示与 Nautilus 匹配的图标和描述,在 KDE 上显示与 Konquerer/whatever 匹配的图标和描述,以及正确打开文件等。

我认为我分别为 KDE 和 Gnome 获取这些信息是可以的。最大的问题是,获取 Linux 桌面的所有这些信息的最常见/最佳/规范方法是什么?Gnome 文档尤其不透明。gnome-vsf 有 mime 例程,但它已被弃用,我找不到 GIO/GFS(gnome-vsf 的替代品)的 mime 例程。有一种模糊的暗示,即应该使用开放桌面应用程序,但使用哪一个却不清楚。libmagic 和 xdg 在哪里适用?

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


解决方案 1:

这是一个使用 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
Description: %s
Default Application: %s
",
            argv[1],
            desc,
            g_app_info_get_executable (app_info));

    return 0;
}

解决方案 2:

您可以使用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

这将激发顿悟。

图标资源的查询功能似乎不可用,但您可以使用pyxdgxdg-utils编写一个小型 Python 脚本,它也能提供大量附加功能。

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

编辑:

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

解决方案 3:

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

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

您可以使用此功能。文档在这里/ (Qt 5)

解决方案 4:

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

假设您在 Gnome、KDE ​​和 Windows 中可以使用不同的图标。例如,在 KDE 中,您可以使用KMimeType。

解决方案 5:

我刚刚找到了KFileItem。此类为您提供了 KDE 中有关图标、MIME 类型和相关内容的所有信息。我确信 gnome 中有一个等效项,但它提供的访问权限与 QT 应用程序的工作级别相同。

解决方案 6:

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

解决方案 7:

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

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

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

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

这将为您提供 mime 类型。无论如何,这就是您了解如何打开文件所需要的。这些是分开的步骤。文件不会告诉您有关图标或用于打开文件的应用程序的信息。

解决方案 8:

大约晚了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 文档的链接:

解决方案 9:

复制/粘贴上面的好例子(使用 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
Description: %s
Default Application: %s
",
            argv[1],
            desc,
            g_app_info_get_executable (app_info));

    g_object_unref(file_info);
    g_object_unref(file);
    return 0;
}
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用