سؤال

أنا أكتب برنامجًا (لنظام التشغيل Mac OS X، باستخدام Objective-C) وأحتاج إلى إنشاء مجموعة من ملفات .webloc برمجيًا.

ملف .webloc هو ببساطة ملف يتم إنشاؤه بعد سحب وإفلات عنوان URL من شريط موقع Safari إلى مجلد ما.

بشكل عام، أحتاج إلى طريقة لإنشاء عناصر في نظام ملفات تشير إلى موقع ما على الويب.كما أفهم، يجب استخدام ملفات .webloc لهذا الغرض على نظام التشغيل Mac OS X.

إذًا، هل من الممكن إنشاء ملف ‎.webloc يحتوي على عنوان url صالح وبعض العناوين له؟

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

المحلول

إنه غير معروف كثيرًا - ولكن يوجد أيضًا تنسيق ملف بسيط قائم على plist لـ weblocs.

عند إنشاء ملفات webloc لك لا أحتاج لحفظها باستخدام طريقة الموارد التي تصفها الملصقات الثلاثة الأخرى.يمكنك أيضًا كتابة قائمة بسيطة:

?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>URL</key>
    <string>http://apple.com</string>
</dict>
</plist>

لا يزال تنسيق المورد الثنائي قيد الاستخدام النشط وإذا كنت تريد قراءة ملف plist - فتأكد أنك بحاجة إلى قراءة تنسيقي الملفين.ولكن عند كتابة الملف - استخدم التنسيق المستند إلى plist - يكون الأمر أسهل كثيرًا.

نصائح أخرى

.webloc تتم كتابة الملفات (بشكل أكثر عمومية، ملفات موقع الإنترنت) بتنسيق يعود تعريفه إلى نظام التشغيل Mac OS 8.x.وهو يعتمد على الموارد، وهو مشتق من تنسيق القطع الذي تحصل عليه عند إنشاء ملف من كائنات مسحوبة مثل النص أو الصور.

الموارد المكتوبة هي 'url ' 256 و 'TEXT' 256، الذي يخزن عنوان URL، واختياريًا "urln" 256، الذي يحتوي على النص المرتبط بعنوان URL. 'drag' 128 نقطة إلى المصدرين (أو الثلاثة) الآخرين.

NTWeblocFile، جزء من إطار عمل Cocoatech مفتوح المصدر يدعم CocoaTechFoundation (مرخص من BSD) كتابة هذه الملفات من Objective-C.إذا كنت تريد تحديد عنوان بشكل منفصل لعنوان URL، فستحتاج إلى تعديل الفئة بحيث تكتب شيئًا آخر غير عنوان URL في 'urln' الموارد.

في نظام التشغيل Mac OS X 10.3 والإصدارات الأحدث، تتم كتابة عنوان URL أيضًا (ويمكن كتابته أيضًا) في قائمة الخصائص في تفرع بيانات الملف.انظر الإجابة الأخرى لكيفية عمل هذا ...

أ .webloc الملف لا يحتوي على أي شيء في تفرع البيانات الخاص به؛بدلاً من ذلك، يقوم بتخزين عنوان URL الذي يشير إليه كمورد في تفرع الموارد الخاص به.يمكنك رؤية ذلك في سطر الأوامر باستخدام ديريز(1) أداة

هنا قمت بتشغيله على .webloc الملف الذي قمت بسحبه من شريط عناوين Safari الخاص بي لهذا السؤال:

% DeRez "Desktop/Crafting .webloc file - Stack Overflow.webloc"
data 'drag' (128, "Crafting .webloc file -#1701953") {
    $"0000 0001 0000 0000 0000 0000 0000 0003"            /* ................ */
    $"5445 5854 0000 0100 0000 0000 0000 0000"            /* TEXT............ */
    $"7572 6C20 0000 0100 0000 0000 0000 0000"            /* url ............ */
    $"7572 6C6E 0000 0100 0000 0000 0000 0000"            /* urln............ */
};

data 'url ' (256, "Crafting .webloc file -#1701953") {
    $"6874 7470 3A2F 2F73 7461 636B 6F76 6572"            /* http://stackover */
    $"666C 6F77 2E63 6F6D 2F71 7565 7374 696F"            /* flow.com/questio */
    $"6E73 2F31 3436 3537 352F 6372 6166 7469"            /* ns/146575/crafti */
    $"6E67 2D77 6562 6C6F 632D 6669 6C65"                 /* ng-webloc-file */
};

data 'TEXT' (256, "Crafting .webloc file -#1701953") {
    $"6874 7470 3A2F 2F73 7461 636B 6F76 6572"            /* http://stackover */
    $"666C 6F77 2E63 6F6D 2F71 7565 7374 696F"            /* flow.com/questio */
    $"6E73 2F31 3436 3537 352F 6372 6166 7469"            /* ns/146575/crafti */
    $"6E67 2D77 6562 6C6F 632D 6669 6C65"                 /* ng-webloc-file */
};

data 'urln' (256, "Crafting .webloc file -#1701953") {
    $"4372 6166 7469 6E67 202E 7765 626C 6F63"            /* Crafting .webloc */
    $"2066 696C 6520 2D20 5374 6163 6B20 4F76"            /*  file - Stack Ov */
    $"6572 666C 6F77"                                     /* erflow */
};

الموارد الوحيدة التي ربما يجب أن تكون هناك هي 'url ' و 'TEXT' موارد المعرف 256، وربما لا تحتاج تلك أسماء الموارد أيضًا.ال 'urln' قد يكون المورد مفيدًا إذا كنت تريد تضمين عنوان المستند الذي يشير إليه عنوان URL أيضًا.ال 'drag' يخبر المورد النظام أن هذا ملف لقطة، لكنني غير متأكد مما إذا كان يجب أن يكون موجودًا في هذا اليوم وهذا العصر.

للعمل مع الموارد وفرع الموارد لملف ما، يمكنك استخدام Resource Manager - وهو أحد الأجزاء الأساسية لـ Carbon والتي تعود إلى جهاز Mac الأصلي.ومع ذلك، هناك عدد من أغلفة الكاكاو لمدير الموارد، مثل ناثان داي NDResourceFork.

هناك طريقة أخرى لإنشاء "اختصار الويب". .url الملف المذكور هنا بالفعل.
تبدو المحتويات (أبسط بكثير من المستندة إلى plist xml):

[InternetShortcut]
URL=http://www.apple.com/

لاحظ أن الملف يحتوي على 3 أسطر، والسطر الأخير فارغ.

مزيد من المعلومات حول تنسيق الملف .url

يستخدم تنسيقًا ثنائيًا يعتمد على شوكة الموارد.

الحلول الصالحة:

  • اطلب من المستخدم سحب عنوان URL من تطبيقك (NSURLPboardType) إلى Finder.سيقوم Finder بإنشاء webloc لك.
  • قم بإنشاء اختصار ويب Windows (ملف .URL).تحتوي هذه الملفات على تنسيق يستند إلى شوكة بيانات يشبه INI ويجب توثيقها في مكان ما على الإنترنت؛يدعمها نظام التشغيل لأنه يدعم weblocs.

إليك كيفية قيام Google Chrome بذلك: WriteURLToNewWebLocFileResourceFork

يؤدي هذا المهمة الأساسية، دون الحاجة إلى أي مكتبات تابعة لجهات خارجية.(كن حذرا:الحد الأدنى من التحقق من الأخطاء.)

// data for 'drag' resource (it's always the same)
#define DRAG_DATA_LENGTH 64
static const unsigned char _dragData[DRAG_DATA_LENGTH]={
    0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
    0x54, 0x45, 0x58, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x75, 0x72, 0x6C, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x75, 0x72, 0x6C, 0x6E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

static void _addData(NSData *data, ResType type, short resId, ResFileRefNum refNum)
{
    Handle handle;
    if (PtrToHand([data bytes], &handle, [data length])==noErr) {
        ResFileRefNum previousRefNum=CurResFile();
        UseResFile(refNum);

        HLock(handle);
        AddResource(handle, type, resId, "\p");
        HUnlock(handle);

        UseResFile(previousRefNum);
    }
}

void WeblocCreateFile(NSString *location, NSString *name, NSURL *fileUrl)
{
    NSString *contents=[NSString stringWithFormat:
                        @"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
                        @"<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
                        @"<plist version=\"1.0\">\n"
                        @"<dict>\n"
                        @"<key>URL</key>\n"
                        @"<string>%@</string>\n"
                        @"</dict>\n"
                        @"</plist>\n", location];

    if ([[contents dataUsingEncoding:NSUTF8StringEncoding] writeToURL:fileUrl options:NSDataWritingAtomic error:nil])
    {        
        // split into parent and filename parts
        NSString *parentPath=[[fileUrl URLByDeletingLastPathComponent] path];
        NSString *fileName=[fileUrl lastPathComponent];

        FSRef parentRef;
        if(FSPathMakeRef((const UInt8 *)[parentPath fileSystemRepresentation], &parentRef, NULL)==noErr)
        {
            unichar fileNameBuffer[[fileName length]];
            [fileName getCharacters:fileNameBuffer];

            FSCreateResFile(&parentRef, [fileName length], fileNameBuffer, 0, NULL, NULL, NULL);
            if (ResError()==noErr)
            {
                FSRef fileRef;
                if(FSPathMakeRef((const UInt8 *)[[fileUrl path] fileSystemRepresentation], &fileRef, NULL)==noErr)
                {
                    ResFileRefNum resFileReference = FSOpenResFile(&fileRef, fsWrPerm);
                    if (resFileReference>0 && ResError()==noErr)
                    {
                        _addData([NSData dataWithBytes:_dragData length:DRAG_DATA_LENGTH], 'drag', 128, resFileReference);
                        _addData([location dataUsingEncoding:NSUTF8StringEncoding], 'url ', 256, resFileReference);
                        _addData([location dataUsingEncoding:NSUTF8StringEncoding], 'TEXT', 256, resFileReference);
                        _addData([name dataUsingEncoding:NSUTF8StringEncoding], 'urln', 256, resFileReference);
                        CloseResFile(resFileReference);
                    }
                }
            }
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top