3

我正在使用一个名为 Objective zip 的库来提取文件。

相关代码:

NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];


ZipFile *unzipFile= [[ZipFile alloc] initWithFileName:requestFinishedPresentationPath mode:ZipFileModeUnzip];
NSArray *infos= [unzipFile listFileInZipInfos];


for (FileInZipInfo *info in infos) {
    NSLog(@"- %@ %@ %d (%d)", info.name, info.date, info.size, info.level);

    [unzipFile locateFileInZip:info.name];

    // Expand the file in memory
    ZipReadStream *read= [unzipFile readCurrentFileInZip];

    NSMutableData *data = [[NSMutableData alloc] initWithLength:256];
    int bytesRead = [read readDataWithBuffer:data];



    [data writeToFile:[documentsDir stringByAppendingPathComponent:info.name] atomically:NO];
    NSLog([documentsDir stringByAppendingPathComponent:info.name]);
    [read finishedReading];


}

[unzipFile close];

第一个 nslog 输出以下内容:

- _some-path_/modules/reference-popup/ref-popup.js 2012-08-21 08:49:36 +0000 109 (-1)

第二个 nslog 输出如下:

/Users/_USER_/Library/Application Support/iPhone Simulator/5.1/Applications/F2649DB7-7806-4C49-8DF9-BD939B2A9D5A/Documents/_some-path_/modules/slide-popup/slide-popup.css

基本上我认为我的读取对象和数据对象没有相互交谈......当我在浏览器中导航到正确的目录时,它所做的只是显示两个文件,它们应该是目录(它们是最顶级的-级目录),但浏览器说它们被写为 1kb 文件。我尝试根据代码中的缓冲区查看文件及其 256 字节文件。

我应该怎么做?

展开 zip(将所有文件正确放入一个目录)?

4

1 回答 1

10

调用 readDataWithBuffer 将填满缓冲区(直到其长度),然后暂停流。实际上,您应该将其置于循环中并在 bytesRead 为 0 时停止。这是为了允许扩展大于可用内存的文件(例如,考虑视频)。

此外,请考虑 zip 文件没有目录结构:目录只是作为压缩文件名的一部分嵌入。由您决定重新创建正确的路径。通常您有一些基本目录,附加压缩文件名并使用生成的完整路径创建文件。

Objective-Zip wiki的最后,您可以找到标题为“内存管理”的部分,其中存在示例循环并进行了注释。一个更完整的例子如下:

    // Open zip descriptor
    ZipFile *zip= [[ZipFile alloc] initWithFileName:zipPath mode:ZipFileModeUnzip];

    NSMutableData *buffer= [[NSMutableData alloc] initWithLength:BUFFER_SIZE];

    // Loop on file list
    NSArray *zipContentList= [zip listFileInZipInfos];
    for (FileInZipInfo *fileInZipInfo in zipContentList) {

        // Check if it's a directory
        if ([fileInZipInfo.name hasSuffix:@"/"]) {
            NSString *dirPath= [documentsPath stringByAppendingPathComponent:fileInZipInfo.name];
            [[NSFileManager defaultManager] createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:NULL];
            continue;
        }

        // Create file
        NSString *filePath= [documentsPath stringByAppendingPathComponent:fileInZipInfo.name];
        [[NSFileManager defaultManager] createFileAtPath:filePath contents:[NSData data] attributes:nil];
        NSFileHandle *file= [NSFileHandle fileHandleForWritingAtPath:filePath];

        // Seek file in zip 
        [zip locateFileInZip:fileInZipInfo.name];
        ZipReadStream *readStream= [zip readCurrentFileInZip];

        // Reset buffer
        [buffer setLength:BUFFER_SIZE];

        // Loop on read stream
        int totalBytesRead= 0;
        do {
            int bytesRead= [readStream readDataWithBuffer:buffer];
            if (bytesRead > 0) {

                // Write data
                [buffer setLength:bytesRead];
                [file writeData:buffer];

                totalBytesRead += bytesRead;

            } else
                break;

        } while (YES);

        // Close file
        [file closeFile];
        [readStream finishedReading];
    }

    // Close zip and release buffer
    [buffer release];
    [zip close];
    [zip release];

希望这可以帮助。

于 2012-09-29T21:45:55.087 回答