Tutorial: How to play with zip files in iOS;

Posted on Updated on

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

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;

Flag Counter

Advertisements

One thought on “Tutorial: How to play with zip files in iOS;

    iamiphonedeveloper said:
    October 24, 2013 at 14:39

    I am trying to open a password protected zip file but cant open it. Can you help me regarding that?

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s