28

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

最も「標準的な」方法を使用して、KDEとgnomeの両方でアイコン、mimeタイプ/ファイルタイプの説明、および関連するアプリケーションを検索したいのですが、コマンドラインへの「シェルアウト」や「低-レベルの"ルーチン、および自分で車輪の再発明を回避する(mime-typesファイルなどを解析しない)。

編集とメモ:

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

私は特にQTについてはもう気にしません、私はKDEとgnomeの両方でC ++ / c関数呼び出しを介してmimeタイプを見つける最も標準的な方法を探しています(特にGnome、それは物事が私を最も混乱させる場所だからです) 。GnomeやKonquererなどでNautilusに一致するアイコンや説明を表示したり、KDEでファイルを適切に開いたりできるようにしたい。

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

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

4

9 に答える 9

15

これは、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;
}
于 2010-01-31T07:14:56.053 に答える
3

特に、xdgから入手できるツールを使用できますxdg-mime query

たとえばファイルのファイルタイプを見つけるにはindex.html

$ xdg-mime query filetype index.html

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

$ xdg-mime query default text/html

これはここに戻りepiphany.desktopます。つまり$APPNAME.desktop、アプリケーション名を簡単に取得できます。デフォルトのアプリでファイルを開きたいだけなら、もちろん実行することもできます

$ xdg-open index.html

これはひらめきを引き起こします。

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

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

編集:

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

于 2010-01-31T05:17:36.850 に答える
3

Qt> = 4.6では、X11システム用の新しい関数があります

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

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

于 2010-12-26T22:52:51.457 に答える
1

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

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

于 2009-10-27T08:44:16.100 に答える
1

KFileItemを見つけました。このクラスは、KDEのアイコン、mimeタイプ、および関連するものすべてを提供します。gnomeにも同等のものがあると確信していますが、これにより、QTアプリケーションが機能するのと同じレベルでアクセスできるようになります。

于 2009-12-04T02:43:15.113 に答える
0

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

于 2009-10-27T17:46:10.590 に答える
0

たぶんこのコードを見てください:http: //ftp.devil-linux.org/pub/devel/sources/1.2/file-4.23.tar.gz

これは、ほとんどのLinux/Unixディストリビューションにある標準のファイルutilです。MIMEタイプといくつかの詳細情報を取得します。

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

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

これにより、mimeタイプが取得されます。それはあなたがファイルを開くことができる方法を知るためにとにかく必要なものです。これらは別々のステップです。ファイルには、ファイルを開くためのアイコンやアプリケーションについては記載されていません。

于 2010-01-27T05:01:49.283 に答える
0

約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およびKServiceドキュメントへのリンク:

于 2019-03-01T15:08:15.263 に答える
0

上記の良い例のコピー/貼り付け(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;

    g_autoptr(GError) error;
    GFile* file = g_file_new_for_path (argv[1]);
    GFileInfo* file_info = g_file_query_info (file,
                                              "standard::*",
                                              G_FILE_QUERY_INFO_NONE,
                                              NULL,
                                              &error);

    const char* content_type = g_file_info_get_content_type (file_info);
    g_autofree gchar* 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));

    g_object_unref(file_info);
    g_object_unref(file);
    return 0;
}
于 2021-05-02T15:17:47.360 に答える