Подтвердить что ты не робот

Как вы получаете значок, тип MIME и приложение, связанные с файлом на рабочем столе Linux?

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

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

Редактирование и примечания:

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

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

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

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

4b9b3361

Ответ 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\nDescription: %s\nDefault Application: %s\n",
            argv[1],
            desc,
            g_app_info_get_executable (app_info));

    return 0;
}

Ответ 2

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

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

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

Ответ 3

Вы можете использовать инструменты, доступные из 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 script с помощью pyxdg, который также предлагает массу дополнительных функций.

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

EDIT:

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

Возможно, вы захотите использовать файл system/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. Это то, что вам нужно, чтобы узнать, как вы можете открыть файл. Это отдельные шаги. файл не говорит вам о значке или приложении, чтобы открыть файл.