Hello Dev mates...

Hope you are enjoying your work in winters; (:
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 lets 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 zip/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 downloaded library into your project and chose "copy items" option from a popup window;
- Add the following values in to your Constants file; If you are using .pch file, then declare then using @define macro;
[code language="objc" wraplines="false"]
//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";
[/code]
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;
[code language="objc" wraplines="false"]
-(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
[/code]
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;
[code language="objc" wraplines="false"]
-(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
[/code]
Thats 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;
Comments (1)
Leave a Reply