Frage

Ich schreibe ein Programm (für Mac OS X, Objective-C verwendet wird) und ich brauche ein paar .webloc Dateien programmatisch erstellen.

Die .webloc Datei wird einfach Datei, die erstellt wird, nachdem Sie eine URL aus dem Safari-Adressleiste zu einem gewissen Ordner per Drag-n-Drop.

Im Allgemeinen muß ich einen Ansatz Elemente in einem Dateisystem, das bis zu einem gewissen Stelle im Web verweisen zu erstellen. Wie ich verstehe .webloc Dateien sollten diese auf Mac OS X verwendet werden.

So ist es möglich, eine .webloc Datei mit einer gültigen URL und einige Titel für das Handwerk?

War es hilfreich?

Lösung

Es ist wenig bekannt -. Aber es gibt auch ein einfaches plist basiertes Dateiformat für weblocs

Wenn Sie Dateien Erstellen webloc Sie müssen nicht um sie zu retten, die Ressource-Methode die anderen drei Plakate beschreiben. Sie können auch eine einfache plist schreiben:

?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>

Das binäre Ressource-Format ist nach wie vor im aktiven Gebrauch und wenn Sie eine plist-Datei lesen mögen - dann sicher, dass Sie benötigen beiden Dateiformate zu lesen. Aber wenn die Datei zu schreiben - mit dem plist basierten Format -. Es viel einfacher ist

Andere Tipps

.webloc Dateien (allgemeine, Internet Standort-Dateien) werden in einem Format, deren Definition geschrieben geht zurück auf Mac OS 8.x Es ist ressourcenbasierten, aus dem Clipping-Format abgeleitet erhalten Sie, wenn Sie eine Datei von geschleppt Objekten wie Text oder Bildern erstellen.

Die schriftlichen Quellen sind 'url ' 256 und 'TEXT' 256, die die URL speichern und gegebenenfalls 'URLn' 256, mit dem Text mit der URL zugeordnet ist. 'drag' 128 Punkte auf die anderen beiden (oder drei) Ressourcen.

NTWeblocFile, ein Teil der Cocoatech Open Source Framework CocoaTechFoundation (BSD-Lizenz), unterstützt diese Schreiben Dateien aus Objective-C. Wenn Sie einen Titel separat an die URL angeben möchten, müssen Sie die Klasse ändern, so dass es etwas anderes als die URL in die 'urln' Ressource schreibt.

Unter Mac OS X 10.3 und höher, wird die URL auch geschrieben (kann auch geschrieben werden) in eine Eigenschaftsliste in der Datenzweig der Datei. Sehen Sie die andere Antwort, wie das funktioniert ...

Eine .webloc Datei hat nichts in seinem Datum Gabel; Stattdessen speichert er die URL es bezieht sich auf eine Ressource in der Ressourcenzweig. Sie können dies auf der Kommandozeile finden Sie in der Derez (1) Werkzeug

Hier habe ich es auf einer .webloc Datei ausführen, die ich für diese Frage meiner Safari Adressleiste Länge gezogen:

% 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 */
};

Die einzigen Ressourcen, die wahrscheinlich sein muss da drin sind die 'url ' und 'TEXT' Ressourcen von ID 256 und die wohl Ressourcennamen auch nicht brauchen. Die 'urln' Ressource könnte nützlich sein, wenn Sie den Titel des Dokuments, die URL auf und enthalten sein sollen. Die 'drag' Ressource teilt dem System mit, dass dies eine Clipping-Datei ist, aber ich bin nicht sicher, ob es muss in der heutigen Zeit, dort sein.

mit Ressourcen und der Ressource-Zweig einer Datei umgehen, verwenden Sie die Resource Manager - eine der zugrunde liegenden Stücke von Kohlenstoff, der wieder auf den ursprünglichen Mac geht. Es gibt jedoch ein paar Cocoa Wrapper für die Resource Manager, wie Nathan Day NDResourceFork .

Eine andere Möglichkeit, „Web-Verknüpfung“ zu machen, ist .url Datei hier bereits erwähnt.
Der Inhalt aussieht (viel simplier als plist XML-basierte):

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

Beachten Sie die Datei 3 Zeilen hat, die letzte Zeile leer ist.

Weitere Informationen über .url Dateiformat

Es verwendet eine Ressourcenzweig-basierte Binärformat.

Gültige Lösungen:

  • Haben der Benutzer eine URL ziehen aus Ihrer Anwendung (NSURLPboardType) an den Finder. Der Finder wird eine webloc für Sie.
  • Erstellen Sie eine Windows Web Shortcut (.URL-Datei). Diese haben ein INI-like Datafork-basiertes Format und sollen irgendwo im Internet zu dokumentieren; das Betriebssystem unterstützt sie, wie es weblocs unterstützt.

Hier ist, wie Google Chrome funktioniert es: WriteURLToNewWebLocFileResourceFork

Dies tut die grundlegende Aufgabe, ohne Drittanbieter-Bibliotheken zu benötigen. (Seien Sie gewarnt:. Minimale Fehlerprüfung)

// 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);
                    }
                }
            }
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top