代码之家  ›  专栏  ›  技术社区  ›  Joe Soul-bringer

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

  •  23
  • Joe Soul-bringer  · 技术社区  · 15 年前

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

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

    编辑和注释:

    嘿,我最初是问这个关于qt文件信息对象的问题的,“没有明确答案”的答案似乎是正确的。但这是一个非常混乱的情况,我正在打开这个问题寻找更多的信息。

    我再也不在乎qt了,我只是在找 在C++和GNOME(尤其是GNOME)上,通过C++/C函数调用MIME类型的方法,因为这是最让我困惑的地方。我希望能够显示与gnome和konkerer/kde上的nautilus匹配的图标和描述,以及适当地打开文件等。

    我想我可以分别为kde和gnome买这个。最大的问题是什么是获取Linux桌面所有这些信息的最常见/最佳/canonical方法?GNOME文档尤其不透明。gnome vsf有mime例程,但它已被弃用,我找不到gio/gfs的mime例程,gnome vsf的替代品。有一个模糊的含义,即一个人应该使用开放式桌面应用程序,但使用哪一个是模糊的。libmagic和xdg在哪里?

    指向一篇总结欣然接受的问题的文章的指针。再说一遍,我知道三行答案是“没有这种动物”,但我在找 长的 回答。

    8 回复  |  直到 6 年前
        1
  •  12
  •   Travis Watkins    15 年前

    下面是一个使用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;
    }
    
        2
  •  3
  •   Benjamin Bannier    11 年前

    您可以使用 xdg 尤其是为了这个 xdg-mime query .

    查找文件类型,例如文件 index.html 你会

    $ xdg-mime query filetype index.html
    

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

    $ xdg-mime query default text/html
    

    这种回报 epiphany.desktop 这里,即 $APPNAME.desktop ,因此很容易从中获取应用程序名。如果你只想打开默认应用程序中的文件,你当然可以运行

    $ xdg-open index.html
    

    这会引起顿悟。

    图标资源的查询函数在中似乎不可用 xdg-utils ,但您可以使用 pyxdg 这也提供了大量的附加功能。

    对于C绑定,您可能需要查看 portland 代码链接到 XDG 页。

    编辑:

    关于 libmagic 朋友们,你需要决定你的偏好:虽然libmagic在文件类型覆盖率方面看起来更完整(更准确)。 一点也不在乎 关于默认应用程序或图标。它也不提供安装额外mimetype的工具。

        3
  •  3
  •   forivall    9 年前

    在qt>=4.6中,x11系统有一个新功能

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

    您可以使用这个函数。 Documentation here / (Qt 5)

        4
  •  1
  •   Gunther Piez    15 年前

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

    假设您可以在gnome、kde和windows中使用不同的图标。例如,在kde中,您将使用 KMimeType .

        5
  •  1
  •   Joe Soul-bringer    15 年前

    我刚刚发现 KFileItem . 这个类为您提供了kde中图标、mime类型和相关内容的一切。我确信在GNOME中有一个等价物,但这提供了与Qt应用程序相同级别的访问。

        6
  •  0
  •   user59634    15 年前

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

        7
  •  0
  •   Albert    15 年前

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

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

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

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

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

        8
  •  0
  •   Jaap Geurts    6 年前

    晚了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 对你的Quew .pro 文件。

    链接到kmimetypetrader&k服务文档:

    推荐文章