From d3c40f0e95ffd418253e17851250a3d75556b021 Mon Sep 17 00:00:00 2001 From: Sam Soffes Date: Wed, 1 Jan 2014 11:00:26 -0800 Subject: [PATCH] =?UTF-8?q?Happy=20New=20Year=20=F0=9F=8E=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Example/Classes/SSAppDelegate.h | 2 +- Example/Classes/SSAppDelegate.m | 2 +- Example/Other Sources/main.m | 2 +- LICENSE | 2 +- SSZipArchive/SSZipArchive.h | 2 +- SSZipArchive/SSZipArchive.m | 132 ++++++++++++++++---------------- Tests/SSZipArchiveTests.m | 90 +++++++++++----------- 7 files changed, 116 insertions(+), 116 deletions(-) diff --git a/Example/Classes/SSAppDelegate.h b/Example/Classes/SSAppDelegate.h index 653d4d7..1cc74e4 100644 --- a/Example/Classes/SSAppDelegate.h +++ b/Example/Classes/SSAppDelegate.h @@ -3,7 +3,7 @@ // SSZipArchive // // Created by Sam Soffes on 9/7/13. -// Copyright (c) 2013 Sam Soffes. All rights reserved. +// Copyright (c) 2013-2014 Sam Soffes. All rights reserved. // @interface SSAppDelegate : UIResponder diff --git a/Example/Classes/SSAppDelegate.m b/Example/Classes/SSAppDelegate.m index bd04f19..3038edb 100644 --- a/Example/Classes/SSAppDelegate.m +++ b/Example/Classes/SSAppDelegate.m @@ -3,7 +3,7 @@ // SSZipArchive // // Created by Sam Soffes on 9/7/13. -// Copyright (c) 2013 Sam Soffes. All rights reserved. +// Copyright (c) 2013-2014 Sam Soffes. All rights reserved. // #import "SSAppDelegate.h" diff --git a/Example/Other Sources/main.m b/Example/Other Sources/main.m index 1944c77..8d9f0b1 100644 --- a/Example/Other Sources/main.m +++ b/Example/Other Sources/main.m @@ -3,7 +3,7 @@ // SSZipArchive // // Created by Sam Soffes on 9/7/13. -// Copyright (c) 2013 Sam Soffes. All rights reserved. +// Copyright (c) 2013-2014 Sam Soffes. All rights reserved. // #import "SSAppDelegate.h" diff --git a/LICENSE b/LICENSE index 0050835..2ed16bd 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2010-2013 Sam Soffes, http://soff.es +Copyright (c) 2010-2014 Sam Soffes, http://soff.es Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/SSZipArchive/SSZipArchive.h b/SSZipArchive/SSZipArchive.h index 67f1c10..9cdf29e 100644 --- a/SSZipArchive/SSZipArchive.h +++ b/SSZipArchive/SSZipArchive.h @@ -3,7 +3,7 @@ // SSZipArchive // // Created by Sam Soffes on 7/21/10. -// Copyright (c) Sam Soffes 2010-2013. All rights reserved. +// Copyright (c) Sam Soffes 2010-2014. All rights reserved. // #ifndef _SSZIPARCHIVE_H diff --git a/SSZipArchive/SSZipArchive.m b/SSZipArchive/SSZipArchive.m index 4b911d7..01e0ef7 100644 --- a/SSZipArchive/SSZipArchive.m +++ b/SSZipArchive/SSZipArchive.m @@ -3,7 +3,7 @@ // SSZipArchive // // Created by Sam Soffes on 7/21/10. -// Copyright (c) Sam Soffes 2010-2013. All rights reserved. +// Copyright (c) Sam Soffes 2010-2014. All rights reserved. // #import "SSZipArchive.h" @@ -46,7 +46,7 @@ + (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination overwrite:(BOOL)overwrite password:(NSString *)password error:(NSError **)error delegate:(id)delegate { // Begin opening - zipFile zip = unzOpen((const char*)[path UTF8String]); + zipFile zip = unzOpen((const char*)[path UTF8String]); if (zip == NULL) { NSDictionary *userInfo = [NSDictionary dictionaryWithObject:@"failed to open zip file" forKey:NSLocalizedDescriptionKey]; if (error) { @@ -54,10 +54,10 @@ } return NO; } - + unz_global_info globalInfo = {0ul, 0ul}; unzGetGlobalInfo(zip, &globalInfo); - + // Begin unzipping if (unzGoToFirstFile(zip) != UNZ_OK) { NSDictionary *userInfo = [NSDictionary dictionaryWithObject:@"failed to open first file in zip file" forKey:NSLocalizedDescriptionKey]; @@ -66,18 +66,18 @@ } return NO; } - + BOOL success = YES; int ret = 0; unsigned char buffer[4096] = {0}; NSFileManager *fileManager = [NSFileManager defaultManager]; NSMutableSet *directoriesModificationDates = [[NSMutableSet alloc] init]; - + // Message delegate if ([delegate respondsToSelector:@selector(zipArchiveWillUnzipArchiveAtPath:zipInfo:)]) { [delegate zipArchiveWillUnzipArchiveAtPath:path zipInfo:globalInfo]; } - + NSInteger currentFileNumber = 0; do { @autoreleasepool { @@ -86,40 +86,40 @@ } else { ret = unzOpenCurrentFilePassword(zip, [password cStringUsingEncoding:NSASCIIStringEncoding]); } - + if (ret != UNZ_OK) { success = NO; break; } - + // Reading data and write to file unz_file_info fileInfo; memset(&fileInfo, 0, sizeof(unz_file_info)); - + ret = unzGetCurrentFileInfo(zip, &fileInfo, NULL, 0, NULL, 0, NULL, 0); if (ret != UNZ_OK) { success = NO; unzCloseCurrentFile(zip); break; } - + // Message delegate if ([delegate respondsToSelector:@selector(zipArchiveWillUnzipFileAtIndex:totalFiles:archivePath:fileInfo:)]) { [delegate zipArchiveWillUnzipFileAtIndex:currentFileNumber totalFiles:(NSInteger)globalInfo.number_entry archivePath:path fileInfo:fileInfo]; } - + char *filename = (char *)malloc(fileInfo.size_filename + 1); unzGetCurrentFileInfo(zip, &fileInfo, filename, fileInfo.size_filename + 1, NULL, 0, NULL, 0); filename[fileInfo.size_filename] = '\0'; - + // // NOTE // I used the ZIP spec from here: // http://www.pkware.com/documents/casestudies/APPNOTE.TXT // // ...to deduce this method of detecting whether the file in the ZIP is a symbolic link. - // If it is, it is listed as a directory but has a data size greater than zero (real + // If it is, it is listed as a directory but has a data size greater than zero (real // directories have it equal to 0) and the included, uncompressed data is the symbolic link path. // // ZIP files did not originally include support for symbolic links so the specification @@ -127,18 +127,18 @@ // by the archivers we're testing. Most of this is figured out through trial and error and // reading ZIP headers in hex editors. This seems to do the trick though. // - + const uLong ZipCompressionMethodStore = 0; - + BOOL fileIsSymbolicLink = NO; - + if((fileInfo.compression_method == ZipCompressionMethodStore) && // Is it compressed? (S_ISDIR(fileInfo.external_fa)) && // Is it marked as a directory (fileInfo.compressed_size > 0)) // Is there any data? { fileIsSymbolicLink = YES; } - + // Check if it contains directory NSString *strPath = [NSString stringWithCString:filename encoding:NSUTF8StringEncoding]; BOOL isDirectory = NO; @@ -146,17 +146,17 @@ isDirectory = YES; } free(filename); - + // Contains a path if ([strPath rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@"/\\"]].location != NSNotFound) { strPath = [strPath stringByReplacingOccurrencesOfString:@"\\" withString:@"/"]; } - + NSString *fullPath = [destination stringByAppendingPathComponent:strPath]; NSError *err = nil; NSDate *modDate = [[self class] _dateWithMSDOSFormat:(UInt32)fileInfo.dosDate]; NSDictionary *directoryAttr = [NSDictionary dictionaryWithObjectsAndKeys:modDate, NSFileCreationDate, modDate, NSFileModificationDate, nil]; - + if (isDirectory) { [fileManager createDirectoryAtPath:fullPath withIntermediateDirectories:YES attributes:directoryAttr error:&err]; } else { @@ -165,57 +165,57 @@ if (nil != err) { NSLog(@"[SSZipArchive] Error: %@", err.localizedDescription); } - + if(!fileIsSymbolicLink) [directoriesModificationDates addObject: [NSDictionary dictionaryWithObjectsAndKeys:fullPath, @"path", modDate, @"modDate", nil]]; - + if ([fileManager fileExistsAtPath:fullPath] && !isDirectory && !overwrite) { unzCloseCurrentFile(zip); ret = unzGoToNextFile(zip); continue; } - + if(!fileIsSymbolicLink) { FILE *fp = fopen((const char*)[fullPath UTF8String], "wb"); while (fp) { int readBytes = unzReadCurrentFile(zip, buffer, 4096); - + if (readBytes > 0) { fwrite(buffer, readBytes, 1, fp ); } else { break; } } - + if (fp) { fclose(fp); - + // Set the original datetime property if (fileInfo.dosDate != 0) { NSDate *orgDate = [[self class] _dateWithMSDOSFormat:(UInt32)fileInfo.dosDate]; NSDictionary *attr = [NSDictionary dictionaryWithObject:orgDate forKey:NSFileModificationDate]; - + if (attr) { if ([fileManager setAttributes:attr ofItemAtPath:fullPath error:nil] == NO) { - // Can't set attributes + // Can't set attributes NSLog(@"[SSZipArchive] Failed to set attributes - whilst setting modification date"); } } } - + // Set the original permissions on the file uLong permissions = fileInfo.external_fa >> 16; if (permissions != 0) { // Store it into a NSNumber NSNumber *permissionsValue = @(permissions); - + // Retrieve any existing attributes NSMutableDictionary *attrs = [[NSMutableDictionary alloc] initWithDictionary:[fileManager attributesOfItemAtPath:fullPath error:nil]]; - + // Set the value in the attributes dict attrs[NSFilePosixPermissions] = permissionsValue; - + // Update attributes if ([fileManager setAttributes:attrs ofItemAtPath:fullPath error:nil] == NO) { // Unable to set the permissions attribute @@ -247,20 +247,20 @@ unzCloseCurrentFile( zip ); ret = unzGoToNextFile( zip ); - + // Message delegate if ([delegate respondsToSelector:@selector(zipArchiveDidUnzipFileAtIndex:totalFiles:archivePath:fileInfo:)]) { [delegate zipArchiveDidUnzipFileAtIndex:currentFileNumber totalFiles:(NSInteger)globalInfo.number_entry archivePath:path fileInfo:fileInfo]; } - + currentFileNumber++; } } while(ret == UNZ_OK && ret != UNZ_END_OF_LIST_OF_FILE); - + // Close unzClose(zip); - + // The process of decompressing the .zip archive causes the modification times on the folders // to be set to the present time. So, when we are done, they need to be explicitly set. // set the modification date on all of the directories. @@ -273,16 +273,16 @@ NSLog(@"[SSZipArchive] Error setting directory file modification date attribute: %@",err.localizedDescription); } } - + #if !__has_feature(objc_arc) [directoriesModificationDates release]; #endif - + // Message delegate if (success && [delegate respondsToSelector:@selector(zipArchiveDidUnzipArchiveAtPath:zipInfo:unzippedPath:)]) { [delegate zipArchiveDidUnzipArchiveAtPath:path zipInfo:globalInfo unzippedPath:destination]; } - + return success; } @@ -296,9 +296,9 @@ for (NSString *path in paths) { [zipArchive writeFile:path]; } - success = [zipArchive close]; + success = [zipArchive close]; } - + #if !__has_feature(objc_arc) [zipArchive release]; #endif @@ -309,15 +309,15 @@ + (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath { BOOL success = NO; - + NSFileManager *fileManager = nil; SSZipArchive *zipArchive = [[SSZipArchive alloc] initWithPath:path]; - + if ([zipArchive open]) { // use a local filemanager (queue/thread compatibility) fileManager = [[NSFileManager alloc] init]; NSDirectoryEnumerator *dirEnumerator = [fileManager enumeratorAtPath:directoryPath]; - + NSString *fileName; while ((fileName = [dirEnumerator nextObject])) { BOOL isDir; @@ -329,12 +329,12 @@ } success = [zipArchive close]; } - + #if !__has_feature(objc_arc) [fileManager release]; [zipArchive release]; #endif - + return success; } @@ -355,7 +355,7 @@ #endif -- (BOOL)open { +- (BOOL)open { NSAssert((_zip == NULL), @"Attempting open an archive which is already open"); _zip = zipOpen([_path UTF8String], APPEND_STATUS_CREATE); return (NULL != _zip); @@ -385,12 +385,12 @@ // *fileName* is the relative name of the file how it is stored within the zip e.g. /folder/subfolder/text1.txt - (BOOL)writeFileAtPath:(NSString *)path withFileName:(NSString *)fileName { NSAssert((_zip != NULL), @"Attempting to write to an archive which was never opened"); - + FILE *input = fopen([path UTF8String], "r"); if (NULL == input) { return NO; } - + const char *afileName; if (!fileName) { afileName = [path.lastPathComponent UTF8String]; @@ -398,7 +398,7 @@ else { afileName = [fileName UTF8String]; } - + zip_fileinfo zipInfo = {{0}}; NSDictionary *attr = [[NSFileManager defaultManager] attributesOfItemAtPath:path error: nil]; @@ -409,36 +409,36 @@ { [self zipInfo:&zipInfo setDate: fileDate ]; } - + // Write permissions into the external attributes, for details on this see here: http://unix.stackexchange.com/a/14727 // Get the permissions value from the files attributes NSNumber *permissionsValue = (NSNumber *)[attr objectForKey:NSFilePosixPermissions]; if (permissionsValue) { // Get the short value for the permissions short permissionsShort = permissionsValue.shortValue; - + // Convert this into an octal by adding 010000, 010000 being the flag for a regular file NSInteger permissionsOctal = 0100000 + permissionsShort; - + // Convert this into a long value uLong permissionsLong = @(permissionsOctal).unsignedLongValue; - + // Store this into the external file attributes once it has been shifted 16 places left to form part of the second from last byte zipInfo.external_fa = permissionsLong << 16L; } } - + zipOpenNewFileInZip(_zip, afileName, &zipInfo, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION); - + void *buffer = malloc(CHUNK); unsigned int len = 0; - + while (!feof(input)) { len = (unsigned int) fread(buffer, 1, CHUNK, input); zipWriteInFileInZip(_zip, buffer, len); } - + zipCloseFileInZip(_zip); free(buffer); fclose(input); @@ -465,7 +465,7 @@ } -- (BOOL)close { +- (BOOL)close { NSAssert((_zip != NULL), @"[SSZipArchive] Attempting to close an archive which was never opened"); zipClose(_zip, NULL); return YES; @@ -488,30 +488,30 @@ static const UInt32 kHourMask = 0xF800; static const UInt32 kMinuteMask = 0x7E0; static const UInt32 kSecondMask = 0x1F; - + static NSCalendar *gregorian; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; }); - + NSDateComponents *components = [[NSDateComponents alloc] init]; NSAssert(0xFFFFFFFF == (kYearMask | kMonthMask | kDayMask | kHourMask | kMinuteMask | kSecondMask), @"[SSZipArchive] MSDOS date masks don't add up"); - + [components setYear:1980 + ((msdosDateTime & kYearMask) >> 25)]; [components setMonth:(msdosDateTime & kMonthMask) >> 21]; [components setDay:(msdosDateTime & kDayMask) >> 16]; [components setHour:(msdosDateTime & kHourMask) >> 11]; [components setMinute:(msdosDateTime & kMinuteMask) >> 5]; [components setSecond:(msdosDateTime & kSecondMask) * 2]; - + NSDate *date = [NSDate dateWithTimeInterval:0 sinceDate:[gregorian dateFromComponents:components]]; - + #if !__has_feature(objc_arc) [components release]; #endif - + return date; } diff --git a/Tests/SSZipArchiveTests.m b/Tests/SSZipArchiveTests.m index 8e0c63e..7497668 100644 --- a/Tests/SSZipArchiveTests.m +++ b/Tests/SSZipArchiveTests.m @@ -3,7 +3,7 @@ // SSZipArchiveTests // // Created by Sam Soffes on 10/3/11. -// Copyright (c) 2011 Sam Soffes. All rights reserved. +// Copyright (c) 2011-2014 Sam Soffes. All rights reserved. // #import "SSZipArchive.h" @@ -28,9 +28,9 @@ [inputPath stringByAppendingPathComponent:@"Readme.markdown"], [inputPath stringByAppendingPathComponent:@"LICENSE"], nil]; - + NSString *outputPath = [self _cachesPath:@"Zipped"]; - + NSString *archivePath = [outputPath stringByAppendingPathComponent:@"CreatedArchive.zip"]; [SSZipArchive createZipFileAtPath:archivePath withFilesAtPaths:inputPaths]; @@ -42,10 +42,10 @@ - (void)testDirectoryZipping { // use Unicode as folder (has a file in root and a file in subfolder) NSString *inputPath = [self _cachesPath:@"Unicode"]; - + NSString *outputPath = [self _cachesPath:@"FolderZipped"]; NSString *archivePath = [outputPath stringByAppendingPathComponent:@"ArchiveWithFolders.zip"]; - + [SSZipArchive createZipFileAtPath:archivePath withContentsOfDirectory:inputPath]; XCTAssertTrue([[NSFileManager defaultManager] fileExistsAtPath:archivePath], @"Folder Archive created"); } @@ -54,13 +54,13 @@ - (void)testUnzipping { NSString *zipPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"TestArchive" ofType:@"zip"]; NSString *outputPath = [self _cachesPath:@"Regular"]; - + [SSZipArchive unzipFileAtPath:zipPath toDestination:outputPath delegate:self]; - + NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *testPath = [outputPath stringByAppendingPathComponent:@"Readme.markdown"]; XCTAssertTrue([fileManager fileExistsAtPath:testPath], @"Readme unzipped"); - + testPath = [outputPath stringByAppendingPathComponent:@"LICENSE"]; XCTAssertTrue([fileManager fileExistsAtPath:testPath], @"LICENSE unzipped"); } @@ -69,14 +69,14 @@ - (void)testUnzippingWithPassword { NSString *zipPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"TestPasswordArchive" ofType:@"zip"]; NSString *outputPath = [self _cachesPath:@"Password"]; - + NSError *error = nil; [SSZipArchive unzipFileAtPath:zipPath toDestination:outputPath overwrite:YES password:@"passw0rd" error:&error delegate:self]; - + NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *testPath = [outputPath stringByAppendingPathComponent:@"Readme.markdown"]; XCTAssertTrue([fileManager fileExistsAtPath:testPath], @"Readme unzipped"); - + testPath = [outputPath stringByAppendingPathComponent:@"LICENSE"]; XCTAssertTrue([fileManager fileExistsAtPath:testPath], @"LICENSE unzipped"); } @@ -85,38 +85,38 @@ - (void)testUnzippingTruncatedFileFix { NSString* zipPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"IncorrectHeaders" ofType:@"zip"]; NSString* outputPath = [self _cachesPath:@"IncorrectHeaders"]; - + [SSZipArchive unzipFileAtPath:zipPath toDestination:outputPath delegate:self]; - + NSString* intendedReadmeTxtMD5 = @"31ac96301302eb388070c827447290b5"; - + NSString* filePath = [outputPath stringByAppendingPathComponent:@"IncorrectHeaders/Readme.txt"]; NSData* data = [NSData dataWithContentsOfFile:filePath]; - + NSString* actualReadmeTxtMD5 = [self _calculateMD5Digest:data]; XCTAssertTrue([actualReadmeTxtMD5 isEqualToString:intendedReadmeTxtMD5], @"Readme.txt MD5 digest should match original."); } - (void)testUnzippingWithSymlinkedFileInside { - + NSString* zipPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"SymbolicLink" ofType:@"zip"]; NSString* outputPath = [self _cachesPath:@"SymbolicLink"]; - + [SSZipArchive unzipFileAtPath:zipPath toDestination:outputPath delegate:self]; - + NSString *testSymlinkFolder = [outputPath stringByAppendingPathComponent:@"SymbolicLink/GitHub.app"]; NSString *testSymlinkFile = [outputPath stringByAppendingPathComponent:@"SymbolicLink/Icon.icns"]; - + NSError *error = nil; NSString *symlinkFolderPath = [[NSFileManager defaultManager] destinationOfSymbolicLinkAtPath:testSymlinkFolder error:&error]; bool symbolicLinkToFolderPersists = ((symlinkFolderPath != nil) && [symlinkFolderPath isEqualToString:@"/Applications/GitHub.app"]) && (error == nil); - + error = nil; - + NSString *symlinkFilePath = [[NSFileManager defaultManager] destinationOfSymbolicLinkAtPath:testSymlinkFile error:&error]; bool symbolicLinkToFilePersists = ((symlinkFilePath != nil) && [symlinkFilePath isEqualToString:@"/Applications/GitHub.app/Contents/Resources/AppIcon.icns"]) && (error == nil); - + XCTAssertTrue(symbolicLinkToFilePersists && symbolicLinkToFolderPersists, @"Symbolic links should persist from the original archive to the outputted files."); } @@ -152,16 +152,16 @@ } - (void)testUnzippingWithUnicodeFilenameInside { - + NSString* zipPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"Unicode" ofType:@"zip"]; NSString* outputPath = [self _cachesPath:@"Unicode"]; - + [SSZipArchive unzipFileAtPath:zipPath toDestination:outputPath delegate:self]; - + bool unicodeFilenameWasExtracted = [[NSFileManager defaultManager] fileExistsAtPath:[outputPath stringByAppendingPathComponent:@"Accént.txt"]]; - + bool unicodeFolderWasExtracted = [[NSFileManager defaultManager] fileExistsAtPath:[outputPath stringByAppendingPathComponent:@"Fólder/Nothing.txt"]]; - + XCTAssertTrue(unicodeFilenameWasExtracted, @"Files with filenames in unicode should be extracted properly."); XCTAssertTrue(unicodeFolderWasExtracted, @"Folders with names in unicode should be extracted propertly."); } @@ -173,15 +173,15 @@ NSArray *inputPaths = [NSArray arrayWithObjects: [inputPath stringByAppendingPathComponent:@"Readme.markdown"], nil]; - + NSDictionary *originalFileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[inputPath stringByAppendingPathComponent:@"Readme.markdown"] error:nil]; NSString *outputPath = [self _cachesPath:@"ZippedDate"]; NSString *archivePath = [outputPath stringByAppendingPathComponent:@"CreatedArchive.zip"]; - + [SSZipArchive createZipFileAtPath:archivePath withFilesAtPaths:inputPaths]; [SSZipArchive unzipFileAtPath:archivePath toDestination:outputPath delegate:self]; - + NSDictionary *createdFileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[outputPath stringByAppendingPathComponent:@"Readme.markdown"] error:nil]; XCTAssertEqualObjects(originalFileAttributes[NSFileCreationDate], createdFileAttributes[@"NSFileCreationDate"], @"Orginal file creationDate should match created one"); @@ -191,39 +191,39 @@ - (void)testZippingAndUnzippingForPermissions { // File we're going to test permissions on before and after zipping NSString *targetFile = @"/Contents/MacOS/TestProject"; - - + + /********** Zipping ********/ - + // The .app file we're going to zip up NSString *inputFile = [[NSBundle mainBundle] pathForResource:@"PermissionsTestApp" ofType:@"app"]; // The path to the target file in the app before zipping NSString *targetFilePreZipPath = [inputFile stringByAppendingPathComponent:targetFile]; - + // Atribtues for the target file before zipping NSDictionary *preZipAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:targetFilePreZipPath error:nil]; - + // Directory to output our created zip file NSString *outputDir = [self _cachesPath:@"PermissionsTest"]; // The path to where the archive shall be created NSString *archivePath = [outputDir stringByAppendingPathComponent:@"TestAppArchive.zip"]; - + // Create the zip file using the contents of the .app file as the input [SSZipArchive createZipFileAtPath:archivePath withContentsOfDirectory:inputFile]; - - + + /********** Un-zipping *******/ - + // Using this newly created zip file, unzip it [SSZipArchive unzipFileAtPath:archivePath toDestination:outputDir]; - + // Get the path to the target file after unzipping NSString *targetFilePath = [outputDir stringByAppendingPathComponent:@"/Contents/MacOS/TestProject"]; - + // Get the file attributes of the target file following the unzipping NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:targetFilePath error:nil]; - + // Compare the value of the permissions attribute to assert equality XCTAssertEqual(fileAttributes[NSFilePosixPermissions], preZipAttributes[NSFilePosixPermissions], @"File permissions should be retained during compression and de-compression"); } @@ -234,7 +234,7 @@ //- (void)testUnzippingLargeFiles { // NSString *zipPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"LargeArchive" ofType:@"zip"]; // NSString *outputPath = [self _cachesPath:@"Large"]; -// +// // [SSZipArchive unzipFileAtPath:zipPath toDestination:outputPath]; //} @@ -269,12 +269,12 @@ if (directory) { path = [path stringByAppendingPathComponent:directory]; } - + NSFileManager *fileManager = [NSFileManager defaultManager]; if (![fileManager fileExistsAtPath:path]) { [fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil]; } - + return path; }