2017-04-25 2 views
0

Je dois extraire les fichiers de l'archive zip. Une partie de ces fichiers peuvent être des liens symboliques. Contenu de ce fichiers ressemble ../../../Braintree/BraintreeUI/Public/UIColor+BTUI.h Ma bibliothèque Décompressez (ZipZap) ont des propriétés de fichiers, donc je sais toujours - est ce fichier est un lien symbolique, ou il est un fichier régulier:NSFileManager créer un lien symbolique avec le contenu

... // open and read archive, list entries 
ZZArchiveEntry *entry = ... // get one entry 
BOOL isSymlink = (entry.fileMode & S_IFLNK) == S_IFLNK; 

Donc, si isSymlink == YES ma tâche est pour créer un fichier de lien symbolique et écrire le contenu de l'élément d'archive dans ce fichier. J'utilise ce code:

NSData *fileData = [entry newDataWithError:nil]; // valid NSData, contents as described above 
NSString *filePath = ... // correct and writable path 
NSDictionary *attributes = @{NSFileType:NSFileTypeSymbolicLink}; 

[[NSFileManager defaultManager] createFileAtPath:filePath contents:fileData attributes:attributes]; 

Mais comme résultat que je reçois un fichier régulier dans le Finder. Lorsque j'extrais mon archive avec l'utilitaire d'archivage Mac intégré, j'obtiens des liens symboliques corrects.

J'essaie aussi cette astuce pour changer le type de fichier après création du fichier:

NSDictionary *original = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil]; 

NSMutableDictionary *newProperties = [original mutableCopy]; 
newProperties[NSFileType] = NSFileTypeSymbolicLink; 

[[NSFileManager defaultManager] setAttributes:newProperties ofItemAtPath:filePath error:nil]; 

NSDictionary *updated = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil]; 

Il n'y a pas d'erreurs, mais dictionnaires originaux et mis à jour sont les mêmes:

NSFileCreationDate = "2017-04-25 22:09:04 +0000"; 
NSFileExtensionHidden = 0; 
NSFileGroupOwnerAccountID = 20; 
NSFileGroupOwnerAccountName = staff; 
NSFileHFSCreatorCode = 0; 
NSFileHFSTypeCode = 0; 
NSFileModificationDate = "2017-04-25 22:09:04 +0000"; 
NSFileOwnerAccountID = 501; 
NSFileOwnerAccountName = wind; 
NSFilePosixPermissions = 420; 
NSFileReferenceCount = 1; 
NSFileSize = 55; 
NSFileSystemFileNumber = 43896483; 
NSFileSystemNumber = 16777217; 
NSFileType = NSFileTypeRegular; 

Quel est le bon façon de créer (ou mettre à jour) les attributs de fichiers et le type de fichier avec NSFileManager, en utilisant la valeur archive entry.fileMode? Dans mes tests c'était 41453.

Répondre

2

Vous devez utiliser createSymbolicLinkAtPath:withDestinationPath:error: pour créer un lien symbolique, vous ne pouvez pas créer un fichier normal et le convertir en un lien. HTH

+0

Merci. Je prends DestinationPath de la chaîne fileData, tout fonctionne correctement comme il se doit. (Avec le chemin relatif comme dans ma question) –