ZipArchive.h
-(NSArray *) UnzipFileLists;
-(NSData *) dataForUnzipFileName

NSString *)fileName;
ZipArchive.mm
Code:
-(NSData *) dataForUnzipFileName:(NSString *)fileName {
int ret = unzLocateFile(_unzFile, [fileName UTF8String], 0);
if(ret != UNZ_OK) {
[self OutputErrorMessage:@"File not found!"];
return nil;
}
NSMutableData *data = [NSMutableData data];
unsigned char buffer[4096] = {0};
int byteRead;
if( [_password length]==0 )
ret = unzOpenCurrentFile( _unzFile );
else
ret = unzOpenCurrentFilePassword( _unzFile, [_password cStringUsingEncoding:NSASCIIStringEncoding] );
if( ret!=UNZ_OK )
{
[self OutputErrorMessage:@"Error occurs"];
return nil;
}
while( YES )
{
byteRead=unzReadCurrentFile(_unzFile, buffer, 4096);
if( byteRead > 0 )
{
[data appendBytes:buffer length:byteRead];
// fwrite(buffer, read, 1, fp );
}
else if( byteRead<0 )
{
[self OutputErrorMessage:@"Failed to reading zip file"];
break;
}
else
break;
}
unzCloseCurrentFile( _unzFile );
return ([data length] != 0)?data:nil;
}
-(NSArray *) UnzipFileLists {
BOOL success = YES;
int ret = unzGoToFirstFile( _unzFile );
// unsigned char buffer[4096] = {0};
// NSFileManager* fman = [NSFileManager defaultManager];
if( ret!=UNZ_OK )
{
[self OutputErrorMessage:@"Failed"];
}
NSMutableArray *fileLists = [NSMutableArray array];
do{
// Get file info
unz_file_info fileInfo ={0};
ret = unzGetCurrentFileInfo(_unzFile, &fileInfo, NULL, 0, NULL, 0, NULL, 0);
if( ret!=UNZ_OK )
{
[self OutputErrorMessage:@"Error occurs while getting file info"];
success = NO;
break;
}
char* filename = (char*) malloc( fileInfo.size_filename +1 );
unzGetCurrentFileInfo(_unzFile, &fileInfo, filename, fileInfo.size_filename + 1, NULL, 0, NULL, 0);
filename[fileInfo.size_filename] = '\0';
// check if it contains directory
NSString * strPath = [NSString stringWithCString:filename];
BOOL isDirectory = NO;
if( filename[fileInfo.size_filename-1]=='/' || filename[fileInfo.size_filename-1]=='\\')
isDirectory = YES;
free( filename );
if( [strPath rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@"/\\"]].location!=NSNotFound )
{// contains a path
strPath = [strPath stringByReplacingOccurrencesOfString:@"\\" withString:@"/"];
}
if(strPath != nil)
[fileLists addObject:strPath];
ret = unzGoToNextFile( _unzFile );
}while( ret==UNZ_OK && UNZ_OK!=UNZ_END_OF_LIST_OF_FILE );
return fileLists;
}