我正在使用ZipArchive来在iOS应用程序中解压缩zip文件,但我想在打开文件之前知道它是否受密码保护,以便可以将密码传递给UnZipOpenFile函数。
zip文件的密码不记录在头部,而是记录在zip文件中的各个文件条目中。
因此,您需要检查zip中的所有文件。
请将此功能添加到ZipArchive中。
-(BOOL) UnzipIsEncrypted {
int ret = unzGoToFirstFile( _unzFile );
if (ret == UNZ_OK) {
do {
ret = unzOpenCurrentFile( _unzFile );
if( ret!=UNZ_OK ) {
return NO;
}
unz_file_info fileInfo ={0};
ret = unzGetCurrentFileInfo(_unzFile, &fileInfo, NULL, 0, NULL, 0, NULL, 0);
if (ret!= UNZ_OK) {
return NO;
}
else if((fileInfo.flag & 1) == 1) {
return YES;
}
unzCloseCurrentFile( _unzFile );
ret = unzGoToNextFile( _unzFile );
} while( ret==UNZ_OK && UNZ_OK!=UNZ_END_OF_LIST_OF_FILE );
}
return NO;
}
-(BOOL) IsEncrypted:(NSString*)path
{
NSData* fileData = [NSData dataWithContentsOfFile:path];
NSData* generalBitFlag = [fileData subdataWithRange:NSMakeRange(6, 2)];
NSString* genralBitFlgStr = [generalBitFlag description];
if ([genralBitFlgStr characterAtIndex:2]!='0')
{
return true;
}
else
{
return false;
}
}
UnzipOpenFile
变量,尝试调用UnzipFileTo
。如果失败了,您可以重新打开一个带有密码的压缩文件,并再次调用UnzipFileTo
。这样做的问题是您将无法区分无效的ZIP文件和使用无效密码之间的区别。unzip.c
中:extern int ZEXPORT unzIsEncrypted (file)
unzFile file;
{
return ((unz_s*)file)->encrypted;
}
unzip.h
的内容:extern int ZEXPORT unzIsEncrypted OF((unzFile file));
ZipArchive.mm
的内容:- (BOOL)ZipIsEncrypted {
return unzIsEncrypted(_unzFile);
}
ZipArchive.h
的内容:- (BOOL)ZipIsEncrypted;
在调用UnzipFileTo
之后使用它。
我正在解压一个超过50MB的加密文件,所以将整个文件加载到NSData中是一个问题。因此,我做了修改并使用了以下代码:
-(BOOL) IsEncrypted:(NSString*)path
{
NSInteger chunkSize = 1024 //Read 1KB chunks.
NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:path];
NSData *fileData = [handle readDataOfLength:chunkSize];
NSData* generalBitFlag = [fileData subdataWithRange:NSMakeRange(6, 2)];
NSString* genralBitFlgStr = [generalBitFlag description];
if ([genralBitFlgStr characterAtIndex:2]!='0')
{
return true;
}
else
{
return false;
}
}