2016-05-18 1 views
1

Pour une application qui existe depuis de nombreuses années et qui a stocké les enregistrements Alias ​​classiques dans des fichiers, j'aime recréer des fichiers Alias ​​pointant vers le même fichier maintenant, sans avoir pour résoudre l'alias en premier (car la destination peut être indisponible à ce moment).Générer un fichier Bookmark à partir d'un enregistrement Mac Alias ​​classique

Soi-disant cela devrait arriver:

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); 

Cependant, la fonction d'écriture échoue, et l'erreur dit: « Le fichier n'a pas pu être sauvé. »

Si je crée à la place des données de signets en utilisant CreateBookmarkData, l'écriture réussit.

Comment est-ce que je fais ce travail? J'essaierais d'écrire un ancien fichier Alias ​​de style avec les données dans la branche de ressource si ce n'était pas si complètement déconseillé.

Voici un exemple d'enregistrement d'alias que j'aurais dans l'objet aliasRecord - Je peux le résoudre en utilisant la fonction classique Alias ​​Manager FSResolveAlias, donc je sais que c'est effectivement valide.

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 

Répondre

2

CFURLCreateBookmarkDataFromAliasRecord() ne crée pas les données de signet avec l'option kCFURLBookmarkCreationSuitableForBookmarkFile requise par CFURLWriteBookmarkDataToFile().

CFURLCreateBookmarkDataFromAliasRecord() était conçu comme un moyen de convertir les enregistrements alias stockés les fichiers de données d'un programme en signets sans E/S.

Avant le CFURLWriteBookmarkDataToFile(), les fichiers Alias ​​du Finder (fichiers signets) ont été créés par le Finder. Ces fichiers contenaient une ressource Alias ​​(contenant des propriétés connues pouvant être obtenues à partir de la ressource Alias ​​avec FSCopyAliasInfo()) et des ressources d'icônes. Apple avait besoin des données de signets dans les fichiers écrits par CFURLWriteBookmarkDataToFile() pour fournir les mêmes propriétés. L'option kCFURLBookmarkCreationSuitableForBookmarkFile applique cette exigence.

Si vous avez un AliasHandle et que vous voulez créer un fichier Alias ​​nouveau style avec des données de signets, vous devrez:

(1) résoudre le AliasHandle à un FSRef, créez un CFURLRef du FSRef, puis créer les données de signet à l'aide de l'option kCFURLBookmarkCreationSuitableForBookmarkFile,
ou
(2), vous devez résoudre les données de signets créés avec CFURLCreateBookmarkDataFromAliasRecord(), puis créez une nouvelle donnée de signet à l'aide de l'option kCFURLBookmarkCreationSuitableForBookmarkFile.

Cependant, vous avez indiqué que vous souhaitez gérer cela sans résoudre le problème AliasHandle, la seule solution consiste donc à créer un ancien fichier Alias ​​du Finder. Bien que je sais que vous savez déjà comment y parvenir, il est décrit au How do I create a Finder alias within an application?.

La première fois qu'un utilisateur résout/ouvre cette ancienne fichier Alias ​​avec le Finder, le Finder détecte le fichier Alias ​​doit être mis à jour (c.-à-CFURLCreateByResolvingBookmarkData() retournera avec isStale == true) et le Finder va créer un nouveau signet à la cible du fichier Alias ​​et réécrivez le fichier Alias. CFURLCreateBookmarkDataFromFile() continuera à prendre en charge les anciens fichiers Alias ​​aussi longtemps que possible pour la rétrocompatibilité.