Wie kommen Sie auf das Symbol, MIME-Typen und Anwendung mit einer Datei in dem Linux-Desktop verbunden?

StackOverflow https://stackoverflow.com/questions/1629172

  •  06-07-2019
  •  | 
  •  

Frage

Mit C ++ auf dem Linux-Desktop, was ist der beste Weg, um das Symbol, die Dokumentbeschreibung und die Anwendung „assoziiert“ mit einem beliebigen Datei / Dateipfad zu bekommen?

Ich mag die meisten „kanonische“ Art und Weise verwenden, Symbole, MIME-Typen / Dateitypbeschreibungen und zugehörige Anwendungen auf KDE und Gnome zu finden und ich mag vermeidet jeden „Beschuss“ zu die Befehlszeile und „low-level“ Routinen sowie die Vermeidung neu zu erfinden das Rad selbst (kein Parsen des Mime-Typ Datei und so weiter).

Edits und Anmerkungen:

Hey, fragte ich ursprünglich diese Frage über das QT-Datei Info-Objekt und die Antwort, dass „es keine klare Antwort“ scheint so weit korrekt zu sein, wie es geht. Aber dies ist eine solche verkorksten Situation, dass ich die Frage bin Öffnung für weitere Informationen.

Ich kümmere mich nicht um QT insbesondere mehr vorhanden, ich bin nur für die die meisten cannonical Weg, um den MIME-Typ über C ++ / C-Funktion fordert KDE und Gnome zu finden (vor allem Gnome, denn das ist, wo die Dinge verwirren mich am meisten). Ich möchte in der Lage zeigen Symbole und Beschreibungen werden passende Nautilus in Gnome und Konquerer / was auch immer auf KDE sowie das Öffnen von Dateien in geeigneter Weise, usw.

Ich nehme an, es ist OK, dass ich dies separat für KDE und Gnome zu bekommen. Die große Frage ist, was ist die häufigste / besten / cannonical Art und Weise all diese Informationen für den Linux-Desktop zu bekommen? Gnome Dokumentation ist besonders undurchsichtig. gnome-VSF hat Routinen Mime aber es ist veraltet, und ich kann nicht eine Mime-Routine für GIO / GVS, gnome-VSF Ersatz finden. Es gibt eine vage Implikation, dass man die offenen Desktop-Anwendungen aber unklar, welche zu benutzen ist verwenden soll. Und wo tut libmagic und xdg passen?

Pointers zu einem Essay der Probleme zusammenfasst werden gerne angenommen. Auch hier weiß ich die Antwort drei line „kein solches Tier“ ist, aber ich bin für die lang Antwort suchen.

War es hilfreich?

Lösung

Hier ist ein Beispiel für GLib / GIO mit den von Ihnen 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;
}

Andere Tipps

Sie können die Tools zur Verfügung, verwenden von xdg dass insbesondere xdg-mime query.

Um die Datei des Typs von beispielsweise herausfinden, eine Datei index.html würden Sie

$ xdg-mime query filetype index.html

Das wird die MIME-Typ zurück. Abzufragen, welche Anwendung mit dieser mimetye Verwendung beispiel verbunden ist.

$ xdg-mime query default text/html

Das gibt epiphany.desktop hier, das heißt $APPNAME.desktop, so ist es einfach, den Namen der Anwendung von ihm zu bekommen. Wenn Sie nur Sie könnten natürlich wollen würden die Datei in dem Standard-App öffnen nur ausführen

$ xdg-open index.html

, die Epiphanie feuern würde.

Abfragefunktionen für Symbol Ressourcen scheinen nicht in xdg-utils verfügbar zu sein, aber man kann einen kleinen Python-Skript mit pyxdg , die Tonnen von zusätzlichen Funktionen bietet, auch.

Für C-Bindungen müssen Sie wahrscheinlich einen Blick in den Code Portland verbunden haben auf der xdg Seite.

EDIT:

In Bezug auf 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 kümmert sich überhaupt nicht über Standard Anwendungen oder Symbole. Es ist auch nicht Sie Werkzeuge zur Verfügung stellen, um zusätzliche MIME-Typen zu installieren.

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. Dokumentation hier / (Qt 5)

Weder QFileIconProvider noch QFileInfo wird alles mit dem O Mime-Datenbank tun. Um Symbole mit verschiedenen MIME-Typen zugeordnet zugreifen, müssen Sie Funktionen des zugrunde liegenden Desktop-Umgebung verwenden. In Qt ist es (noch) keine kanonische Weise.

Betrachten Sie ein anderes Symbol in Gnome, KDE und Windows haben. So zum Beispiel in KDE würden Sie KMimeType .

ich gerade gefunden KFileItem . Diese Klasse gibt Ihnen alles, was Sie für die Symbole, Mime-Typen und die damit verbundenen Dinge in KDE. Ich bin sicher, dass es ein Äquivalent in gnome ist aber das gibt den Zugriff auf gleicher Höhe als QT-Anwendung funktioniert.

Sie möchten das System des „/etc/mime.types“ Datei verwenden. Es ist auch eine gute Idee, Ihr Programm Kopie einer MIME-Datei zu erhalten. Auf diese Weise sind Sie nicht auf dem System abhängig, aber zur gleichen Zeit müssen Sie es ziemlich erschöpfend zu halten. Nicht sicher Icons.

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

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

Ich denke, sowohl Gnome und KDE ihre eigenen Wege, dies zu bestimmen, und auch für sie das Symbol und die Standard-Anwendung zu setzen.

Wie auch immer, dass Datei-Tool ist wahrscheinlich der beste Weg, um den MIME-Typen und die Dokumentbeschreibung zu erhalten. Und in einigen Fällen sogar einige Details über den Inhalt.

Dies wird Ihnen den MIME-Typ erhalten. Das ist, was Sie sowieso müssen wissen, wie Sie die Datei öffnen können. Dies sind getrennte Schritte. Datei nicht Sie sagt über das Symbol noch die Anwendung mit der Datei zu öffnen.

über 8 Jahre zu spät, aber immer noch nützlich.

Um die zugehörigen Anwendungen in KDE erhalten Sie tun können, was Joe vorgeschlagen (mit KFileItem). Aber das erfordert die Aufnahme von vielen Bibliotheken. Der folgende Code erfordert weniger.

#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();
  }
}

Um den Code add QT += KService KCoreAddons auf Ihre Qmake .pro Datei zu kompilieren.

Links zu KMimeTypeTrader & KService Dokumentation:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top