我正在寻找标题所说的 - 一个Cocoa库,能够以ZIP格式列出文件,并根据请求提取单个文件。这些功能分别是'unzip -l'和'unzip $ archive $ filename'命令 - 我正在寻找一个框架/ API来实现这一点,比如Java的'java.util.zip'。
似乎逻辑后备是使用NSTask来调用命令行'unzip app',并且我愿意使用它。但是,我认为首先寻找非NSTask解决方案可能会更好。
答案 0 :(得分:3)
http://code.google.com/p/objective-zip/
读取文件
ZipFile *unzipFile= [[ZipFile alloc] initWithFileName:@"test.zip" mode:ZipFileModeUnzip];
[unzipFile goToFirstFileInZip];
ZipReadStream *read= [unzipFile readCurrentFileInZip];
NSMutableData *data= [[NSMutableData alloc] initWithLength:256];
int bytesRead= [read readDataWithBuffer:data];
[read finishedReading];
[zipFile close];
列出
内的文件ZipFile *unzipFile= [[ZipFile alloc] initWithFileName:@"test.zip" mode:ZipFileModeUnzip];
NSArray *infos= [unzipFile listFileInZipInfos];
for (FileInZipInfo *info in infos) {
NSLog(@"- %@ %@ %d (%d)", info.name, info.date, info.size, info.level);
// Locate the file in the zip
[unzipFile locateFileInZip:info.name];
// Expand the file in memory
ZipReadStream *read= [unzipFile readCurrentFileInZip];
NSMutableData *data= [[NSMutableData alloc] initWithLength:256];
int bytesRead= [read readDataWithBuffer:data];
[read finishedReading];
}
[zipFile close];
关于目标结构的说明
请注意,在zip文件中没有文件夹层次结构的表示:它只是嵌入在文件名中(即:名为x/y/z/file.txt
的文件)。由程序提取文件以将这些文件名视为表达结构并在文件系统上重建(在创建期间反之亦然)。常见的拉链/解压缩器只是遵循这条规则。
来自manual
答案 1 :(得分:0)
请参阅LOZIPFileWrapper:
LOZIPFileWrapper *zipFileWrapper = [[LOZIPFileWrapper alloc] initWithURL:URL password:nil error:NULL];
NSArray *contentsOfZipArchive = [zipFileWrapper contentOfZIPFileIncludingFolders:YES error:NULL];
NSData *content = [zipFileWrapper contentsAtPath:contentsOfZipArchive[0] error:NULL];
答案 2 :(得分:-1)
您可以使用Marek Sebera的想法,但您可以从列出zip文件内容开始:
理念一:
- 只需获取原始标题列表(使用上述想法)并拥有UITableView
- 选择标题后,从uitableview获取zip中的文件编号,然后取消归档
文件名示例:
lol.txt
路径/ hello.doc
路径/目录/洛尔/ file.txt的
理念二:
- 取消归档到某个地方(如图书馆目录)
- 用户完成后,重新压缩