Linuxデスクトップでファイルに関連付けられたアイコン、MIMEタイプ、およびアプリケーションを取得するにはどうすればよいですか?
質問
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 を使用しますa>。
KFileItem 。このクラスは、KDEのアイコン、MIMEタイプ、および関連するもののすべてを提供します。私はgnomeに同等のものがあると確信していますが、これによりQTアプリケーションが機能するのと同じレベルでアクセスできます。
システムの&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のドキュメント: