2017-04-25 16 views
0

私はzipアーカイブからファイルを抽出する必要があります。そのファイルの一部にシンボリックリンクを使用できます。それは、ファイルの内容が../../../Braintree/BraintreeUI/Public/UIColor+BTUI.hマイ解凍ライブラリのように見える(ZipZap)は、ファイルのプロパティを持っているので、私はいつも知っている - このファイルはシンボリックリンクである、またはそれは通常のファイルです:NSFileManagerはコンテンツ付きシンボリックリンクを作成します

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

だから、isSymlink == YES私のタスクは、ある場合にはシンボリックリンクファイルを作成し、アーカイブアイテムの内容をそのファイルに書き込む。私はこのコードを使用します:

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

結果として私はFinderで通常のファイルを取得します。内蔵のMacアーカイブユーティリティを使用してアーカイブを解凍すると、正しいシンボリックリンクが得られます。

私はまたファイル作成後、ファイルの種類を変更するには、このトリックを試してみてください。

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

そこにはエラーはありませんが、オリジナルと更新された辞書が同じである:正しい

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; 

何アーカイブentry.fileModeの値を使用して、NSFileManagerでファイル属性とファイルタイプを作成(または更新)する方法?私のテストでは41453でした。

答えて

2

シンボリックリンクの作成にはcreateSymbolicLinkAtPath:withDestinationPath:error:を使用する必要があります。通常のファイルを作成してリンクに変換することはできません。 HTH

+0

ありがとうございます。私はfileData文字列からDestinationPathを取る、すべて正常に動作する必要があります。 (私の質問のような相対的なパスで) –

関連する問題