2009-10-27 10 views
23

Mit C++ auf dem Linux-Desktop, was ist der beste Weg, um das Symbol, die Dokumentbeschreibung und die Anwendung mit einem beliebigen Datei-/Dateipfad "assoziiert" zu bekommen?Wie erhalten Sie das Symbol, den MIME-Typ und die Anwendung, die mit einer Datei auf dem Linux-Desktop verknüpft sind?

Ich würde gerne die "kanonische" Art und Weise verwenden, um Symbole, Mime-Typ/Dateityp Beschreibungen und zugehörige Anwendungen sowohl auf KDE und Gnome zu finden und ich würde gerne vermeiden, "schälen" auf die Kommandozeile und "Low-Level" Routinen sowie die Neu erfindung des Rades selbst (keine Analyse der MIME-Typen-Datei und so).

Edits und Anmerkungen:

Hey, fragte ich ursprünglich diese Frage über die QT-Info-Objekt und die Antwortdatei: „Es gibt keine klare Antwort“ scheint so weit korrekt zu sein, wie es geht. Aber das ist so eine vermasselte Situation, dass ich die Frage nach weiteren Informationen öffne.

ich nicht mehr insbesondere über QT egal, ich suche nur für den meisten cannonical Weg, um den MIME-Typen über C++/C-Funktion auf KDE und Gnome ruft zu finden (vor allem Gnome, denn das ist, wo mich die Dinge am meisten verwirren). Ich möchte in der Lage sein, Symbole und Beschreibungen zu zeigen, die zu Nautilus in Gnome und Konquerer/whatever auf KDE passen, sowie das Öffnen von Dateien etc.

Ich nehme an, es ist OK, dass ich das separat für KDE und Gnome bekomme. Die große Frage ist, was ist die häufigste/beste/kanonische Art, all diese Informationen für den Linux-Desktop zu bekommen? Gnome Dokumentation ist besonders undurchsichtig. Gnome-vsf hat Mime-Routinen, aber es ist veraltet und ich finde keine Pantomime-Routine für GIO/GFS, gnome-vsf Ersatz. Es gibt eine vage Implikation, dass man die offenen Desktop-Anwendungen verwenden sollte, aber welche man verwendet, ist unklar. Und wo passen libmagic und xdg?

Zeiger auf einen Aufsatz zusammenfassend die Probleme gerne angenommen. Auch hier weiß ich, dass die drei Zeilen Antwort "kein solches Tier" ist, aber ich suche nach der langen Antwort.

+0

Btw, ohne mehr mehr detaillierte Antworten, werde ich die Antwort Prämie auslaufen lassen, ohne es jedem zu geben ... –

Antwort

12

Hier ist ein Beispiel für die Verwendung von GLib/GIO, um die gewünschten Informationen zu erhalten.

#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; 
} 
+0

Scheint oder weniger wie ich suche. Irgendwelche Links, die diese Funktionen dokumentieren? –

+0

http://library.gnome.org/devel/gio/stable/ ist die Hauptseite für GIO-Dokumente, aus der ersichtlich ist, welcher Bereich einer Funktion basierend auf dem Namen offensichtlich ist. –

+0

Sieht gut aus: GIO zielt darauf ab, "eine API bereitzustellen, die so gut ist, dass Entwickler sie gegenüber unformatierten POSIX-Aufrufen bevorzugen" - wenn Entwickler diese Seite jemals finden können! Keine Links von alten gnomeVFS-Seiten und verwendet nicht das Stichwort "Mime" oder "Dateiverknüpfungen und kam nicht in einer ziemlich langen Google-Suche - nun, jetzt weiß ich! Danke –

1

Weder QFileIconProvider noch QFileInfo werden irgendetwas mit der OS-MIME-Datenbank tun. Um auf Symbole zuzugreifen, die mit verschiedenen MIME-Typen verknüpft sind, müssen Sie Funktionen der zugrunde liegenden Desktop-Umgebung verwenden. In Qt gibt es (noch) keine kanonische Methode.

Sie können ein anderes Symbol in Gnome, in KDE und in Windows haben. Zum Beispiel würden Sie in KDE KMimeType verwenden.

+0

s/Window-Manager/Desktop-Umgebung/ – ephemient

+0

Dank, eine Idee über gnome? –

+0

Siehe meine Notizen zum Ändern der Richtung der Frage ... –

0

Sie können die Datei "/etc/mime.types" des Systems verwenden. Es ist auch eine gute Idee, Ihre Programmkopie einer MIME-Typdatei beizubehalten. Auf diese Weise sind Sie nicht abhängig von dem System, aber gleichzeitig müssen Sie es ziemlich erschöpfend halten. Ich bin mir nicht sicher über Icons.

1

Ich habe gerade gefunden KFileItem. Diese Klasse gibt dir alles, was du für Icons, Mime-Typen und verwandte Dinge in KDE hast. Ich bin mir sicher, dass es ein Äquivalent in gnome gibt, aber dies gibt Zugang auf dem gleichen Level wie eine QT-Anwendung.

0

nehmen Vielleicht einen Blick auf diesen Code: http://ftp.devil-linux.org/pub/devel/sources/1.2/file-4.23.tar.gz

Dies ist die Standard-Datei ist util auf den meisten Linux/Unix-Distributionen. Sie erhalten den MIME-Typ und weitere Informationen.

Ich denke, sowohl Gnome als auch KDE haben ihre eigenen Wege, dies zu bestimmen und auch das Icon und die Standardanwendung dafür zu setzen.

Wie auch immer, dieses Datei-Tool ist wahrscheinlich der beste Weg, um den Mime-Typ und die Dokumentbeschreibung zu erhalten. Und in manchen Fällen sogar einige Details über den Inhalt.

Dies wird Ihnen die Pantomime-Typ. Das ist, was Sie sowieso brauchen, um zu wissen, wie Sie die Datei öffnen können. Dies sind getrennte Schritte. Die Datei sagt nichts über das Symbol oder die Anwendung, mit der die Datei geöffnet werden soll.

+0

Kann ein bisschen mehr Erklärung liefern? Ich habe schon viel Code durchgesehen. –

+0

Außerdem war das Archiv ungültig, als ich es heruntergeladen habe –

+0

Was genau wollen Sie wissen? Kennen Sie den Befehl 'Datei' nicht? Öffnen Sie einfach ein Terminal und geben Sie "file $ somefile" ein. Dieses Tool erkennt sehr gut automatisch den Dateityp. Und es ist ziemlich Standard. Ich habe den Link aktualisiert, es scheint ungültig geworden zu sein. – Albert

2

Hierfür können Sie die von xdg verfügbaren Tools verwenden, insbesondere xdg-mime query.

Um den Dateityp von z.B. Eine Datei index.html würden Sie

$ xdg-mime query filetype index.html 

Dies wird den Mimetype zurückgeben. Um abzufragen, welche Anwendung mit diesem Mimetye-Einsatz verbunden ist, z.B.

$ xdg-mime query default text/html 

Dies gibt epiphany.desktop hier, das heißt $APPNAME.desktop, so dass er den Namen der Anwendung bekommen von ihm einfach. Wenn Sie nur Sie natürlich laufen nur

konnte
$ xdg-open index.html 

wollen würde, um die Datei in der Standard-App öffnen, die Epiphanie feuern würde.

Abfragefunktionen für Symbolressourcen scheinen in xdg-utils nicht verfügbar zu sein, aber Sie könnten ein kleines Pythonskript schreiben, das pyxdg verwendet, das Tonnen von zusätzlicher Funktionalität außerdem bietet.

Für C-Bindungen müssen Sie wahrscheinlich einen Blick in die portland Code auf der xdg Seite verlinkt.

EDIT:

Bezüglich libmagic und Freunde, müssen Sie auf Ihre Vorlieben entscheiden: Während libmagic mehr vollständig zu sein scheint (und genau) in Bezug auf Abdeckung für Dateitypen, es überhaupt nicht schert Alle über Standardanwendungen oder Symbole. Es bietet Ihnen auch keine Tools zum Installieren zusätzlicher MIME-Typen.

+0

1. Wie könnte ich xdg aus C++ 2 aufrufen. Könnten Sie die Unterschiede von xdg/libmagic erweitern? –

+0

1. Die xdg-utils sind nur Shell-Skripte, also müssen Sie etw. Verwenden. wie popen(). Wenn Sie Python verwenden können, schreiben Sie etw. dediziert mit pyxdg (oder dedizierte Teile in C++ neu implementieren). 2. AFAIK xdg-utils sind nur Frontends für den Umgang mit KDE- oder GNOME-Extension-> Mimetype-Datenbanken und nur dann, wenn diese nicht auf libmagic/file zurückgehen, um den Mimetyp zu identifizieren. Libmagic ist eine Datenbank, die sogar Binärdatei-Header enthält, so dass es viel genauer sein kann. Das große Plus der Verwendung von xdg ist, dass Sie die Verantwortung für einige Funktionen aus Ihrem Code entlasten können, anstatt alles von Grund auf neu zu schreiben. –

3

In Qt> = 4.6, gibt es eine neue Funktion für X11 Systeme

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

Sie können diese Funktion verwenden. Documentation here/(Qt 5)