Как вы получаете значок, тип MIME и приложение, связанное с файлом на рабочем столе Linux? - PullRequest
23 голосов
/ 27 октября 2009

С использованием C ++ на рабочем столе Linux, как лучше всего получить значок, описание документа и приложение, «связанное» с произвольным путем к файлу / файлу?

Я бы хотел использовать самый «канонический» способ поиска значков, описаний mime-типов / типов файлов и связанных приложений как в KDE, так и в gnome, и я бы хотел избегать любых «обстрелов» для командная строка и подпрограммы «низкого уровня», а также предотвращение повторного изобретения колеса самостоятельно (без разбора файла mime-types и тому подобного).

Правки и примечания:

Привет, я изначально задавал этот вопрос об объекте информации файла QT, и ответ, что "нет четкого ответа", кажется верным, насколько это возможно. НО это такая испорченная ситуация, что я открываю вопрос в поисках дополнительной информации.

Меня больше не волнует QT, я просто ищу самый канонический способ найти тип mime с помощью вызовов функций C ++ / c как в KDE, так и в gnome (особенно в Gnome) , поскольку это то, где вещи смущают меня больше всего). Я хочу иметь возможность отображать значки и описания, соответствующие Nautilus в Gnome и Konquerer / что угодно в KDE, а также открывать файлы соответствующим образом и т. Д.

Полагаю, нормально, что я получаю это отдельно для KDE и Gnome. Большой вопрос в том, какой самый распространенный / лучший / канонический способ получить всю эту информацию для рабочего стола Linux? Документация гнома особенно непрозрачна. У gnome-vsf есть подпрограммы mime, но она устарела, и я не могу найти подпрограмму mime для GIO / GFS, замены gnome-vsf. Существует смутное предположение, что следует использовать приложения с открытым рабочим столом, но какое использовать неясно. И где libmagic и xdg подходят?

Указатели на эссе, в котором кратко изложены вопросы, с радостью принятые. Опять же, я знаю, что ответ из трех строк - «нет такого животного», но я ищу ответ long .

Ответы [ 8 ]

12 голосов
/ 31 января 2010

Вот пример использования 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;
}
3 голосов
/ 27 декабря 2010

В Qt> = 4.6 есть новая функция для систем X11

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

Вы можете использовать эту функцию. Документация здесь / (Qt 5)

3 голосов
/ 31 января 2010

Для этого вы можете использовать инструменты, доступные из 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, но вы могли бы написать небольшой скрипт на python, используя pyxdg , который также предлагает множество дополнительных функций.

Для привязок C вам, вероятно, потребуется просмотреть код portland , связанный на странице xdg .

EDIT:

Относительно libmagic и его друзей вам нужно будет определиться с вашими предпочтениями: хотя libmagic выглядит более полным (и точным) с точки зрения охвата типов файлов, его не волнует о стандартные приложения или значки. Он также не предоставляет инструментов для установки дополнительных типов mimety.

1 голос
/ 04 декабря 2009

Я только что нашел KFileItem . Этот класс дает вам все, что вам нужно для значков, типов пантомимы и связанных с ними вещей в KDE. Я уверен, что в gnome есть эквивалент, но это дает доступ на том же уровне, что и приложение QT.

1 голос
/ 27 октября 2009

Ни QFileIconProvider, ни QFileInfo ничего не сделают с базой данных Mime ОС. Для доступа к значкам, связанным с различными типами пантомимы, вам придется использовать функции базовой среды рабочего стола. В Qt (пока) нет канонического пути.

Учтите, что у вас может быть другой значок в Gnome, в KDE и в Windows. Так, например, в KDE вы бы использовали KMimeType .

0 голосов
/ 01 марта 2019

Около 8 лет с опозданием, но все еще полезно.

Чтобы получить связанные приложения в KDE, вы можете сделать то, что предложил Джо (используя 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:

0 голосов
/ 27 января 2010

Может быть, посмотрите на этот код: http://ftp.devil -linux.org / паб / Devel / источники / 1.2 / файл-4.23.tar.gz

Это стандартная утилита, используемая в большинстве дистрибутивов Linux / Unix. Вы получите MIME-тип и дополнительную информацию.

Я думаю, что и Gnome, и KDE имеют свои собственные способы определения этого, а также установки значка и стандартного приложения для него.

В любом случае, этот файл-инструмент, вероятно, лучший способ получить тип mime и описание документа. А в некоторых случаях даже некоторые подробности о содержании.

Это даст вам пантомиму. Это то, что вам нужно в любом случае, чтобы знать, как вы можете открыть файл. Это отдельные шаги. В файле не говорится ни о значке, ни о приложении, с которым можно открыть файл.

0 голосов
/ 27 октября 2009

Вы можете использовать системный файл /etc/mime.types.Это также хорошая идея, чтобы сохранить копию вашей программы файла типа MIME.Таким образом, вы не зависите от системы, но в то же время вы должны держать ее достаточно исчерпывающей.Не уверен насчет иконок.

...