如何获取与 Linux 桌面中的文件关联的图标、MIME 类型和应用程序?
题
在 Linux 桌面上使用 C++,获取与任意文件/文件路径“关联”的图标、文档描述和应用程序的最佳方法是什么?
我想使用最“规范”的方式在 KDE 和 gnome 上查找图标、mime 类型/文件类型描述和相关应用程序,并且我想 避免任何“炮击”命令行 和“低级”例程,以及避免自己重新发明轮子(不解析 mime 类型文件等)。
编辑和注释:
嘿,我最初问这个关于 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 适合在哪里?
指向总结这些问题的文章的指针很高兴被接受。再说一次,我知道三行答案是“没有这样的动物”,但我正在寻找 长的 回答。
解决方案
以下是使用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;
}
其他提示
您可以使用 xdg 中提供的工具,特别是 xdg-mime查询代码>
找出例如文件类型您将
的文件 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 也提供了大量的附加功能。
对于C绑定,您可能需要查看 portland 代码链接在 xdg 页面上。
修改强>
关于 libmagic
和朋友,你需要决定你的偏好:虽然libmagic似乎在文件类型的覆盖范围方面更完整(和准确),它并不关心所有关于默认应用程序或图标。它也没有为您提供安装额外mimetypes的工具。
QFileIconProvider和QFileInfo都不会对OS mime数据库执行任何操作。要访问与不同mime类型关联的图标,您必须使用底层桌面环境的功能。在Qt中,(还)没有规范的方式。
考虑到你可以在Gnome,KDE和Windows中拥有不同的图标。例如,在KDE中,您可以使用 KMimeType 一>
我刚刚找到 KFileItem 。这个类为您提供KDE中的图标,mime类型和相关内容的所有内容。我确信在gnome中有一个等价物,但这可以在与QT应用程序相同的级别上进行访问。
您可能想要使用系统的“/etc/mime.types"文件。维护程序的MIME类型文件副本也是一个好主意。这样,您不依赖于系统,但同时您需要保持相当详尽。不确定图标。
也许看看这段代码: http://ftp.devil-linux。组织的/ pub / devel的/来源/ 1.2 /文件4.23.tar.gz
这是大多数Linux / Unix发行版中的标准文件util。您将获得MIME类型和更多信息。
我认为Gnome和KDE都有自己的方法来确定它,并为它设置图标和标准应用程序。
无论如何,该文件工具可能是获取mime类型和文档描述的最佳方式。在某些情况下甚至还有一些关于内容的细节。
这会让你获得mime类型。无论如何,您需要知道如何打开文件。这些是分开的步骤。文件没有说明你的图标,也没有说明打开文件的应用程序。
晚了大约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 文档的链接: