2009-10-27 5 views
23

LinuxデスクトップでC++を使用すると、アイコン、ドキュメントの説明、およびアプリケーションを任意のファイル/ファイルパスに "関連付ける"ための最良の方法は何ですか?Linuxデスクトップで、ファイルに関連付けられたアイコン、MIMEタイプ、およびアプリケーションをどのように取得しますか?

アイコン、mime-type /ファイルタイプの説明、関連するアプリケーションをKDEとgnomeの両方で見つけるのに最も標準的な方法を使用したいと思います。は、コマンドラインと "低レベル"ルーチンだけでなく、自分自身を再発明することを避ける(mime-typesファイルなどを解析しない)。

編集とNotes:

ねえ、私はもともと「明確な答えはありません」というQTファイル情報オブジェクトとの回答については、この質問を限りそれが行くように正しいと思われます。しかし、これは私が質問を開いて、もっと詳しい情報を探しているような状況になります。

私はより具体的にQTを気にしない、私はちょうどそれがですので、C++/C関数を経由してMIMEタイプを見つけるため最も cannonical方法は、特にノーム(KDEとGNOMEの両方に呼び出して探しています物事は私を最も混乱させる)。私はGnomeとKonquererのNautilus、KDEのファイルやその他のファイルを適切に開くことができます。

私はこれをKDEとGnomeで別々に入手しても問題ないと思います。大きな疑問は、Linuxデスクトップのすべての情報を得るための最も一般的な/ベスト/標準的な方法は何ですか? Gnomeのドキュメントは特に不透明です。 gnome-vsfにはmimeルーチンがありますが、廃止予定であり、gnome-vsfの代わりにGIO/GFSのmimeルーチンが見つかりません。オープンなデスクトップアプリケーションを使用する必要があるが、使用するアプリケーションは不明確であるという曖昧な示唆があります。 libmagicとxdgはどこに収まるの?

喜んで受け入れられている問題を要約したエッセイへのポインタ。繰り返しますが、私は3つのラインの答えが "そのような動物"ではないことを知っていますが、私はを探しています答え。

+0

ところで、より多くの任意のより詳細な回答せずに、私は/誰... –

答えて

12

ここでは、GLib/GIOを使用して必要な情報を取得する例を示します。 Qtの> = 4.6で

#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

私が探しているものと似ていないようです。これらの機能を文書化しているリンクはありますか? –

+0

http://library.gnome.org/devel/gio/stable/は、GIOドキュメントのメインページです。関数のセクションは、その名前に基づいて明らかにする必要があります。 –

+0

見栄え:GIOは、開発者がこのページを見つけることができたら、開発者が未処理のPOSIX呼び出しよりも優れたAPIを提供することを目指しています!古いgnomeVFSページからのリンクがなく、キーワード「Mime」や「ファイルの関連付け」を使わず、かなり長いGoogle検索には出てこなかった - よく分かったよ!ありがとう –

1

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

Gnome、KDE、およびWindowsでは、別のアイコンを使用することができます。たとえば、KDEではKMimeTypeを使用します。

+0

S /ウィンドウマネージャ/デスクトップ環境にそれを与えることなく、回答恵みが期限切れ – ephemient

+0

おかげで、GNOMEについての考えを聞かせてのだろうか? –

+0

質問の方向を変更する方法について編集ノートを参照してください... –

0

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

1

ただ見つけたKFileItem。このクラスはKDEのアイコン、MIMEタイプ、関連するものすべてを提供します。私はgnomeに相当するものがあると確信していますが、これはQTアプリケーションと同じレベルでアクセスできます。

0

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

これは、ほとんどのLinux/Unixのディストリビューションで見つけutilの標準ファイルです。あなたはMIMEタイプといくつかのより多くの情報を得るでしょう。

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

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

これはあなたにmime-typeを与えます。これは、ファイルを開く方法を知るために必要なものです。これらは別々のステップです。ファイルはアイコンやファイルを開くアプリケーションについてはあなたには言いません。

+0

少し説明を追加できますか?私はすでにたくさんのコードを見てきました。 –

+0

さらに、アーカイブをダウンロードしたときに無効だった –

+0

正確に何を知りたいですか?あなたは 'file'コマンドを知らないのですか?ターミナルを開き、 "file $ somefile"と入力してください。このツールは、ファイルの種類を自動的に検出するのに非常に優れています。それはかなり標準です。 リンクを更新しました。無効になったようです。 – Albert

2

xdgから入手可能なツール、特にxdg-mime queryを使用することができます。

ファイルタイプを確認するには、次のようにします。ファイルindex.htmlあなたは

$ xdg-mime query filetype index.html 

これはmimetypeを返します。そのアプリケーションに関連付けられているアプリケーションを照会するには、たとえば次のようにします。

$ xdg-mime query default text/html 

これはすなわち$APPNAME.desktop、ここepiphany.desktopを返しますので、そこからアプリケーション名を取得することは容易です。あなただけのデフォルトのアプリでファイルを開くしたい場合は、もちろん単なるひらめきを起動します

$ xdg-open index.html 

を実行することができます。

アイコンリソースのクエリ機能はxdg-utilsで利用できないようですが、追加の機能を多数提供するpyxdgを使用して小さなPythonスクリプトを作成することもできます。

Cバインディングの場合は、xdgページにリンクされているportlandコードを調べる必要があります。

EDIT:libmagicや友人に関する

、あなたの好みに決定する必要があります:libmagicのは、より完全な(かつ正確)であるように思わながらファイルタイプのカバレッジの観点から、それは時に気にしません。デフォルトのアプリケーションやアイコンについては、すべてです。また、追加のMIMEタイプをインストールするためのツールも提供していません。

+0

1. xdgをC++ 2からどのように呼び出すことができますか?xdg/libmagicの違いを拡張できますか? –

+0

1. xdg-utilsは単なるシェルスクリプトなので、sthを使う必要があります。 popen()のように。場合は、Pythonを使用してsthを書くことができます。 pyxdgを使用して専用(またはC++で専用部品を再実装)。 2. AFAIK xdg-utilsは、KDEまたはGNOME extension-> mimetypeデータベースを処理するフロントエンドにすぎず、これらがlibmagic/fileでフォールバックしてmimetypeを識別できない場合にのみ発生します。 Libmagicは、バイナリファイルヘッダーを含むdbであるため、はるかに正確です。 xdgを使うことの大きな利点は、すべてをゼロから書き直すのではなく、コードからいくつかの機能の責任を取り除くことができることです。 –

3

は、X11システム

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

あなたはこの機能を使用することができるため、新たな機能があります。 Documentation here/(Qt 5)

関連する問題