كيف يمكنك الحصول على رمز نوع MIME, و التطبيق المقترن مع الملفات في لينكس سطح المكتب ؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

باستخدام C++ على سطح المكتب لينكس ، ما هي أفضل طريقة للحصول على رمز الوثيقة وصف التطبيق "المرتبطة" مع التعسفي ملف/ملف الطريق ؟

أود أن استخدام أكثر "canonical" طريقة للعثور على الرموز ، mime نوع/نوع الملف أوصاف والتطبيقات المرتبطة بها على كل من كدي و جنوم و أود أن تجنب أي "القصف" إلى سطر الأوامر و "مستوى منخفض" الروتين وكذلك تجنب إعادة اختراع العجلة نفسي (لا تحليل mime-أنواع الملفات مثل هذا).

التعديلات و الملاحظات:

مرحبا, أنا أصلا سألت هذا السؤال عن QT معلومات الملف كائن والجواب أنه "لا توجد إجابة واضحة" يبدو أن يكون صحيحا بقدر ما يذهب.ولكن هذا هو مثل لقد الحالة التي أنا افتتاح السؤال تبحث عن مزيد من المعلومات.

أنا لا أهتم QT على وجه الخصوص أي أكثر من ذلك, أنا فقط أبحث عن معظم cannonical طريقة للعثور على نوع mime عبر C++/c المكالمات الدالة على كل من كدي و جنوم (خاصة جنوم, منذ ذلك حيث الأشياء تخلط بين لي أكثر).كنت تريد أن تكون قادرة على إظهار الرموز و الأوصاف مطابقة نوتيلوس في جنوم و Konquerer/أيا كان كدي وكذلك فتح الملفات بشكل مناسب ، إلخ.

أعتقد أنه لا بأس أن أحصل على هذا منفصل عن كدي و جنوم.السؤال الكبير هو ما هو الأكثر شيوعا/أفضل/cannonical طريقة للحصول على كل هذه المعلومات لينكس سطح المكتب ؟ جنوم وثائق خاصة مبهمة.gnome-vsf وقد mime الروتينية لكنه مستنكر وأنا لا يمكن العثور mime الروتين جيو/GFS, gnome-vsf بديل.هناك غامضة ضمنا أنه ينبغي للمرء أن استخدام تطبيقات سطح المكتب ولكن الذي هو غامض.وأين libmagic و xdg ؟

مؤشرات مقال يلخص القضايا قبلت بكل سرور.مرة أخرى أنا أعرف ثلاثة خط الجواب هو "لا يوجد مثل هذا الحيوان" ولكن أنا أبحث عن طويلة الجواب.

هل كانت مفيدة؟

المحلول

هنا هو مثال على استخدام سطحي/جيو للحصول على المعلومات التي تريدها.

#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

هذا سيعود نوعه.الاستعلام عن التطبيق يرتبط مع أن mimetye استخدام مثل

$ xdg-mime query default text/html

وهذا يعود epiphany.desktop هنا أي $APPNAME.desktop, لذلك فمن السهل الحصول على التطبيق اسم منه.إذا كنت تريد فتح الملف في التطبيق الافتراضي يمكن بالطبع مجرد تشغيل

$ xdg-open index.html

التي من شأنها أن النار حتى عيد الغطاس.

وظائف الاستعلام عن رمز الموارد لا يبدو أن تكون متاحة في xdg-utils, ولكن يمكن أن تكتب صغير الثعبان النصي باستخدام pyxdg الذي يوفر طن من وظائف إضافية أيضا.

ج الارتباطات وربما كنت سوف تحتاج إلى النظر في بورتلاند كود ربط على xdg الصفحة.

تحرير:

فيما يتعلق libmagic والأصدقاء, سوف تحتاج إلى أن تقرر على التفضيلات الخاصة بك:في حين libmagic يبدو أكثر اكتمالا (دقيقة) من حيث التغطية نوع الملف, أنه لا يهتم على الإطلاق حول التطبيقات الافتراضية أو الرموز.كما أنها لا توفر لك مع أدوات تثبيت إضافية mimetypes.

في Qt >= 4.6 هناك وظيفة جديدة X11 نظم

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

يمكنك استخدام هذه الوظيفة. الوثائق هنا / (Qt 5)

لا QFileIconProvider ولا QFileInfo سوف تفعل أي شيء مع نظام التشغيل mime قاعدة البيانات الخاصة بنا.للوصول إلى الرموز المرتبطة مع مختلف أنواع mime, سيكون لديك لاستخدام الوظائف الأساسية بيئة سطح المكتب.في Qt هناك (حتى الآن) لا الكنسي الطريق.

تنظر هل يمكن أن يكون رمز مختلف في جنوم في كدي في ويندوز.هكذا على سبيل المثال ، في كدي يمكنك استخدام KMimeType.

أنا فقط وجدت KFileItem.هذه الدرجة يوفر لك كل شيء عن الرموز أنواع mime و الأمور ذات الصلة في كدي.أنا متأكد من أن هناك ما يعادلها في جنوم ولكن هذا يعطي إمكانية الحصول على نفس المستوى كما QT يعمل التطبيق.

قد ترغب في استخدام النظام "/etc/mime.أنواع الملفات".بل هو أيضا فكرة جيدة للحفاظ على البرنامج الخاص بك نسخة من رسالة MIME نوع الملف.بهذه الطريقة أنت لا تعتمد على النظام, ولكن في نفس الوقت عليك أن تبقى إلى حد ما شاملة.غير متأكد حول الرموز.

ربما نلقي نظرة على هذا الكود:http://ftp.devil-linux.org/pub/devel/sources/1.2/file-4.23.tar.gz

هذا هو المعيار الملف util العثور على معظم لينكس/يونكس التوزيعات.سوف تحصل على MIME-type بعض مزيد من المعلومات.

أعتقد أن كل من ترى بهم السبل لتحديد هذا أيضا تعيين رمز تطبيق معيار لذلك.

على كل حال هذا الملف-أداة هو على الارجح أفضل طريقة للحصول على mime نوع الوثيقة الوصف.وحتى في بعض الحالات بعض التفاصيل حول المحتوى.

هذا سوف تحصل على الملف من نوع.هذا ما يجب على كل حال أن تعرف كيف يمكنك فتح الملف.هذه هي فصل الخطوات.الملف لا أقول لكم عن رمز أو تطبيق لفتح الملف.

عن 8 سنوات في وقت متأخر, ولكن لا تزال مفيدة.

للحصول على التطبيقات المرتبطة في كدي يمكنك أن تفعل ما اقترحه جو (باستخدام 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