Linux 데스크탑의 파일과 관련된 아이콘, 마임 유형 및 응용 프로그램을 어떻게 얻습니까?

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

  •  06-07-2019
  •  | 
  •  

문제

Linux 데스크탑에서 C ++를 사용하면 아이콘, 문서 설명 및 임의의 파일/파일 경로와 "연관된"응용 프로그램을 얻는 가장 좋은 방법은 무엇입니까?

KDE 및 GNOME 모두에서 아이콘, 마임 유형/파일 유형 설명 및 관련 응용 프로그램을 찾기 위해 가장 "정식"방법을 사용하고 싶습니다. 명령 줄에 "껍질을 끄는"것을 피하십시오. "저수준"루틴은 물론 휠을 직접 재발하는 것을 피할뿐만 아니라 (MIME 타입 파일을 구문 분석하지 않음).

편집 및 메모 :

이봐, 나는 원래 QT 파일 정보 객체에 대해이 질문을했고 "명확한 대답이 없다"는 대답은 그다지 올바른 것으로 보인다. 그러나 이것은 더 많은 정보를 찾기 위해 질문을 열어 놓고 나사로운 상황입니다.

나는 더 이상 QT에 대해 신경 쓰지 않는다. 나는 단지 대부분 C ++/C 함수를 통해 MIME 유형을 찾는 대포 적 방법은 KDE와 Gnome을 모두 호출합니다 (특히 Gnome, 그것이 나를 가장 혼동하는 곳이기 때문에). 나는 KDE의 Gnome과 Konquerer/uthing의 Nautilus와 일치하는 아이콘과 설명을 보여줄 수 있고 적절하게 파일을 열 수 있기를 원합니다.

KDE와 GNOME에 대해 별도로 얻는 것이 괜찮다고 생각합니다. 큰 문제는 Linux 데스크탑에 대한이 모든 정보를 얻는 가장 일반적인/최고/대포 적 방법은 무엇입니까? 그놈 문서는 특히 불투명합니다. Gnome-VSF는 MIME 루틴을 가지고 있지만 더 이상 사용되지 않으며 Gio/GFS, Gnome-VSF의 대체품을위한 마임 루틴을 찾을 수 없습니다. 개방형 데스크탑 애플리케이션을 사용해야하지만 사용해야 할 것은 모호하다는 모호한 의미가 있습니다. 그리고 Libmagic과 XDG는 어디에 적합합니까?

기꺼이 받아 들여진 문제를 요약 한 에세이에 대한 포인터. 다시, 나는 세 줄의 대답이 "그런 동물이 없다"는 것을 알고 있지만 나는 대답.

도움이 되었습니까?

해결책

다음은 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 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

주현절을 해고 할 것입니다.

아이콘 리소스의 쿼리 기능은 xdg-utils, 그러나 당신은 pyxdg 그것은 수많은 추가 기능을 제공합니다.

C 바인딩의 경우 아마도 포틀랜드 코드에 연결되어 있습니다 XDG 페이지.

편집하다:

에 관하여 libmagic 그리고 친구, 당신은 당신의 선호도를 결정해야 할 것입니다 : libmagic은 filetypes에 대한 적용 범위 측면에서 더 완전하고 정확한 것처럼 보입니다. 전혀 신경 쓰지 않습니다 기본 응용 프로그램 또는 아이콘 정보. 또한 추가 모방 유형을 설치하는 도구를 제공하지 않습니다.

QT> = 4.6에는 X11 시스템에 대한 새로운 기능이 있습니다.

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

이 기능을 사용할 수 있습니다. 여기 문서 / (QT 5)

QfileiconProvider 나 QfileInfo는 OS MIME 데이터베이스와 관련하여 아무것도하지 않습니다. 다양한 MIME 유형과 관련된 아이콘에 액세스하려면 기본 데스크탑 환경의 기능을 사용해야합니다. QT에는 아직 표준적인 방법이 없습니다.

그놈, KDE 및 Windows에서 다른 아이콘을 가질 수 있다고 생각하십시오. 예를 들어, KDE에서는 사용할 것입니다 kmimeType.

방금 찾았습니다 kfileitem. 이 클래스는 KDE의 아이콘, 마임 유형 및 관련 사항에 대한 모든 것을 제공합니다. 그놈에는 동등한 것이 있다고 확신하지만 QT 응용 프로그램 작업과 동일한 수준에서 액세스 할 수 있습니다.

시스템의 "/etc/mime.types"파일을 사용할 수 있습니다. 또한 프로그램의 MIME 유형 파일 사본을 유지하는 것도 좋습니다. 그렇게하면 시스템에 의존하지 않지만 동시에 상당히 철저하게 유지해야합니다. 아이콘에 대해 확실하지 않습니다.

이 코드를 살펴보십시오.http://ftp.devil-linux.org/pub/devel/sources/1.2/file-4.23.tar.gz

이것은 대부분의 Linux/UNIX 배포판에서 찾은 표준 파일 Util입니다. 마임 유형과 더 많은 정보를 얻을 수 있습니다.

나는 그놈과 KDE 모두 이것을 결정하고 아이콘과 표준 애플리케이션을 설정하는 방법이 있다고 생각합니다.

어쨌든, 그 파일 툴은 아마도 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 및 Kservice 문서에 대한 링크 :

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top