Linuxデスクトップでファイルに関連付けられたアイコン、MIMEタイプ、およびアプリケーションを取得するにはどうすればよいですか?

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

  •  06-07-2019
  •  | 
  •  

質問

LinuxデスクトップでC ++を使用して、アイコン、ドキュメントの説明、および「関連」アプリケーションを取得する最良の方法は何ですか。任意のファイル/ファイルパスで?

ほとんどの「標準」を使用したいKDEとgnomeの両方でアイコン、MIMEタイプ/ファイルタイプの説明、および関連するアプリケーションを検索する方法と、「シェリングアウト」を避けたいコマンドラインへと「低レベル」ルーチンを作成するだけでなく、自分でホイールを再発明することを避けます(MIMEタイプファイルなどの解析は行いません)。

編集とメモ:

ねえ、私はもともとQTファイル情報オブジェクトと「明確な答えはありません」という答えについてこの質問をしました。それが行く限り正しいようです。しかし、これは非常にめちゃくちゃな状況なので、詳細情報を探して質問を始めています。

QTは特に気にしません。KDEとgnome(特にGnome、それは物事が私を最も混乱させる場所だからです)。 GnomeとKonquerer / KDEでNautilusに一致するアイコンと説明を表示できるだけでなく、ファイルを適切に開くなどしたい

KDEとGnomeで別々に取得しても大丈夫だと思います。大きな疑問は、Linuxデスクトップでこれらすべての情報を取得するための最も一般的/最良/標準的な方法は何ですか? Gnomeのドキュメントは特に不透明です。 gnome-vsfにはmimeルーチンがありますが、これは非推奨であり、gnome-vsfの代わりとなるGIO / GFSのmimeルーチンが見つかりません。オープンデスクトップアプリケーションを使用する必要があるが、どちらを使用するかはあいまいです。そして、libmagicとxdgはどこに収まりますか?

喜んで受け入れられた問題を要約したエッセイへのポインター。繰り返しますが、3行の答えは「このような動物はいません」ということです。しかし、私は long の答えを探しています。

役に立ちましたか?

解決

これは、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;
}

他のヒント

xdg から利用可能なツール、特に xdg-mimeを使用できます。クエリ

たとえば、 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 では使用できないようですが、 pyxdg は、多くの追加機能も提供します。

Cバインディングの場合は、リンクされたポートランドコードを参照する必要があります。 xdg ページ。

編集:

libmagic および友人に関しては、設定を決定する必要があります。ファイルタイプのカバレッジに関してlibmagicはより完全(かつ正確)であるように見えますが、デフォルトのアプリケーションまたはアイコンに関するすべて。また、追加のMIMEタイプをインストールするためのツールも提供しません。

Qt&gt; = 4.6には、X11システム用の新しい関数があります

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

この機能を使用できます。 こちらのドキュメント / (Qt 5)

QFileIconProviderもQFileInfoも、OS mimeデータベースでは何もしません。さまざまなMIMEタイプに関連付けられたアイコンにアクセスするには、基盤となるデスクトップ環境の機能を使用する必要があります。 Qtには(まだ)標準的な方法はありません。

Gnome、KDE、およびWindowsで異なるアイコンを使用できると考えてください。そのため、たとえば、KDEでは KMimeType

システムの&quot; /etc/mime.types"を使用できます。ファイル。プログラムのMIMEタイプファイルのコピーを保持することもお勧めします。そうすれば、システムに依存することはありませんが、同時に十分に網羅する必要があります。アイコンについてはわかりません。

このコードを見てみましょう: http://ftp.devil-linux。 org / pub / devel / sources / 1.2 / file-4.23.tar.gz

これは、ほとんどのLinux / Unixディストリビューションで見られる標準ファイルutilです。 MIMEタイプとその他の情報を取得します。

GnomeとKDEの両方に、独自の方法でこれを決定し、アイコンとその標準アプリケーションを設定する方法があると思います。

とにかく、そのファイルツールはおそらくMIMEタイプとドキュメントの説明を取得する最良の方法です。また、場合によっては、コンテンツに関するいくつかの詳細さえも。

これにより、MIMEタイプが取得されます。とにかく、ファイルを開く方法を知るために必要なものです。これらは個別の手順です。ファイルは、ファイルを開くアイコンやアプリケーションについてあなたに言っていません。

約8年遅れですが、まだ有用です。

KDEで関連アプリケーションを取得するには、Joeが提案したことを実行できます( 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へのリンク&amp; KServiceのドキュメント:

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top