Как вы получаете значок, тип 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 подходят?
Указатели на эссе, в котором суммируются вопросы, с радостью принимаются. Опять же, я знаю, что три ответных строки - "нет такого животного", но я ищу длинный ответ.
Ответы
Ответ 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. Это то, что вам нужно, чтобы узнать, как вы можете открыть файл. Это отдельные шаги. файл не говорит вам о значке или приложении, чтобы открыть файл.