2016-05-18 15 views
1

Für eine App, die seit vielen Jahren existiert und die klassischen Alias-Datensätze in Dateien gespeichert hat, möchte ich jetzt Alias-Dateien neu erstellen, die auf die gleiche Datei verweisen, ohne um den Alias ​​zuerst zu beheben (weil das Ziel in diesem Moment möglicherweise nicht verfügbar ist).Erstelle eine Bookmark-Datei aus einem klassischen Mac Alias-Datensatz

Angeblich soll dies soll dies erreichen:

CFDataRef aliasRecord = ... ; // contains the Alias Record data, see below for an example 
CFURLRef url = ... ; // initialized with a file URL 
CFDataRef bmData = CFURLCreateBookmarkDataFromAliasRecord (NULL, aliasRecord); 
CFError error; 
bool ok = CFURLWriteBookmarkDataToFile (bmData, url, 0, &error); 

jedoch die Schreibfunktion schlägt fehl, und der Fehler sagt: „Die Datei kann nicht gespeichert werden.“

Wenn ich stattdessen Lesezeichen Daten mit CreateBookmarkData erstellen, ist der Schreibvorgang erfolgreich.

Wie mache ich das? Ich würde versuchen, eine Alias-Datei im alten Stil mit den Daten in der Resource Fork zu schreiben, wenn das nicht so absolut veraltet war.

Hier ist ein Beispiel Alias-Datensatz, den ich im AliasRecord-Objekt haben würde - ich kann dies mit dem klassischen Alias-Manager FSResolveAlias Funktion lösen, so dass ich weiß, dass es tatsächlich gültig ist.

00 00 00 00 01 12 00 02 00 01 06 54 54 73 4D 42 
50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 CC 31 2F 12 48 2B 00 00 01 A5 
F3 9B 03 74 6D 70 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 01 AC 1C 67 D1 FE B7 D0 00 00 00 00 00 00 
00 00 FF FF FF FF 00 00 09 20 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 07 70 72 69 76 61 74 
65 00 00 10 00 08 00 00 CC 31 12 F2 00 00 00 11 
00 08 00 00 D1 FE 9B B0 00 00 00 01 00 04 01 A5 
F3 9B 00 02 00 13 54 54 73 4D 42 50 3A 70 72 69 
76 61 74 65 3A 00 74 6D 70 00 00 0E 00 08 00 03 
00 74 00 6D 00 70 00 0F 00 0E 00 06 00 54 00 54 
00 73 00 4D 00 42 00 50 00 12 00 0B 70 72 69 76 
61 74 65 2F 74 6D 70 00 00 13 00 01 2F 00 FF FF 
00 00 

Antwort

2

CFURLCreateBookmarkDataFromAliasRecord() schafft nicht die Lesezeichen-Daten mit der kCFURLBookmarkCreationSuitableForBookmarkFile Option von CFURLWriteBookmarkDataToFile() erforderlich.

war als eine Möglichkeit vorgesehen, Alias-Datensätze zu konvertieren, die in einem Programm eigene Datendateien in Lesezeichen ohne I/O gespeichert haben.

Vor CFURLWriteBookmarkDataToFile(), Finder Alias-Dateien (Lesezeichen-Dateien) wurden vom Finder erstellt. Diese Dateien enthielten eine Alias-Ressource (die bekannte Eigenschaften enthielt, die von der Alias-Ressource mit FSCopyAliasInfo() erhalten werden konnten) und Symbolressourcen. Apple benötigte die Lesezeichendaten in den Dateien, die von CFURLWriteBookmarkDataToFile() geschrieben wurden, um dieselben Eigenschaften bereitzustellen. Die Option kCFURLBookmarkCreationSuitableForBookmarkFile erzwingt diese Anforderung.

Wenn Sie eine AliasHandle haben und wollen einen neuen Stil Alias-Datei mit Lesezeichen-Daten erstellen, müssen Sie zu:

(1), um die AliasHandle zu einem FSRef beheben, erstellen Sie eine CFURLRef vom FSRef, und dann erstellen Sie die Lesezeichen Daten mit der kCFURLBookmarkCreationSuitableForBookmarkFile Option,
oder
(2) müssen Sie die Lesezeichen Daten mit erstellt, und erstellen Sie dann ein neues Lesezeichen Daten mit der Option kCFURLBookmarkCreationSuitableForBookmarkFile.

Sie haben jedoch angegeben, dass Sie das Problem lösen möchten, ohne die AliasHandle zu lösen. Die einzige Lösung besteht darin, eine Finder Alias-Datei im alten Stil zu erstellen. Obwohl ich weiß, dass Sie bereits wissen, wie man das erreicht, ist es unter How do I create a Finder alias within an application? beschrieben.

Das erste Mal, wenn ein Benutzer löst/öffnet, dass im alten Stil Alias-Datei mit dem Finder, erkennt der Finder der Alias-Datei aktualisiert werden muss (dh CFURLCreateByResolvingBookmarkData() mit isStale == true zurück) und der Finder ein neues Lesezeichen erstellen zum Ziel der Alias-Datei und schreibe die Alias-Datei neu. CFURLCreateBookmarkDataFromFile() unterstützt weiterhin alte Alias-Dateien so lange wie möglich aus Gründen der Abwärtskompatibilität.