How to Play With Zip Files in iOS

Aasim Naseem 29

Hello Dev mates…
Hope you are enjoying your work in winters; (:

A few days back I was working on a project where I needed to compress some files to create a zip archive; Although my teammate has done much of the work, I just refined some business logic and finalized the code to complete this feature; So let’s start and see how we achieved this

1. Setup your project

  • Download an open-source library from here; It is a very handy library for zipping/unzip operations, written by Shannon Ai (acsolu@gmail.com)
  • Create new project in Xcode (or open your existing one)
  • Add libz.1.2.3.dylib into your project frameworks;
  • Drag and drop the downloaded library into your project and chose the “copy items” option from a popup window;
  • Add the following values to your Constants file; If you are using .pch file, then declare then using @define macro;

//in .h file
FOUNDATION_EXPORT NSString *const kZipFileName; //name of zip file to be created;
FOUNDATION_EXPORT NSString *const kDirNameToCompress; //name of directory who’s contents will be compressed;
FOUNDATION_EXPORT NSString *const kTargetDirName;//directory name where zip file will be extracted;
FOUNDATION_EXPORT NSString *kZipFileCreateErrorMessage; //error message string;
FOUNDATION_EXPORT NSString *kErroMessageTitle; //error title;
FOUNDATION_EXPORT NSString *kOKButtonTitle; //Title of cancel button over alert view;

//in .m file
NSString *const kZipFileName = @”CompressedData.zip”;
NSString *const kTargetDirName = @”AnyDirName”;
NSString *const kDirNameToCompress @”dirToZip_OR_fileNameToZip”;
FOUNDATION_EXPORT NSString *kZipFileCreateErrorMessage = @”Unable to to create zip file. Please try again later”;
FOUNDATION_EXPORT NSString *kErroMessageTitle = @”Error”;
FOUNDATION_EXPORT NSString *kOKButtonTitle = @”Ok”;

2. Create a zip file in any directory under/Document;

  • #import “ZipArchive.h” into your class where you want to write zip code;
  • Use the following code to create a zip file;

-(void) createZipFile{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *zipFile = [documentsDirectory stringByAppendingPathComponent:kZipFileName];//The place where zip file will be created;
ZipArchive *zip = [[ZipArchive alloc] init];
BOOL result = [zip CreateZipFile2:zipFile];//this line will create an empty zip file with 0 KB in size;
if(result){
NSError *error;
NSArray *allFiles = [[NSFileManager defaultManager]contentsOfDirectoryAtPath:kDirNameToCompress error:&error];//get list of all files in directory which need to compress;
for(int index = 0; index<allFiles.count; index++){
id singleFileName = [allFiles objectAtIndex:index];
NSString *singleFilePath = [kDirNameToCompress stringByAppendingPathComponent:singleFileName];
[zip addFileToZip:singleFilePath newname:singleFileName];//one file has been added into zip archive
}//end for
[zip CloseZipFile2];
[zip release];//ignore this if you are using ARC
}else{
[self showErrorMessage:kZipFileCreateErrorMessage withTitle:kErroMessageTitle];
}//end else
}//end createZipFile
//——————————————————
-(void) showErrorMessage:(NSString *)paramErrorMessage withTitle:(NSString*) paramTitle{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:paramTitle message:paramErrorMessage
delegate:nil
cancelButtonTitle:kOKButtonTitle otherButtonTitles:nil];
[alert show];
[alert release];//ignore this if you are using ARC;
}//showErrorMessage

3. Decompress a zip archive;

  • #import “ZipArchive.h” into your class where you want to write unzip code;
  • Use the following code to extract a zip file;

-(void) decompressZipArchive {
NSString * documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex: 0];
NSString * zipFilePath = [documentsDirectory stringByAppendingPathComponent: kZipFileName];
NSString * targetDirPath = [documentsDirectory stringByAppendingPathComponent: kTargetDirName];
ZipArchive * zipArchive = [
[ZipArchive alloc] init
];
if ([zipArchive UnzipOpenFile: zipFilePath]) {
if ([zipArchive UnzipFileTo: targetDirPath overWrite: YES] != NO) { //one magical line
//do whatever you want to do with uncompressed data
//or just leave as it is after handling errors
} //end if
[zipArchive UnzipCloseFile];
} //end if
[zipArchive release]; //ignore this if you are using ARC
} //end decompressZipArchive

That’s all; You can use this code as it is into your project; Leave a comment if you find yourself in any trouble;

Happy coding, and happy winters;

Flag Counter


Leave a Reply

Your email address will not be published. Required fields are marked *