在可可中解压缩文件

时间:2010-02-19 13:47:05

标签: cocoa

我有一个压缩文件,我想提取它的内容。我应该做些什么来实现它。是否有任何框架可以解压缩cocoa框架或目标C中的文件。

7 个答案:

答案 0 :(得分:6)

如果你在iOS上或不想使用NSTask或其他什么,我推荐我的库SSZipArchive

用法:

NSString *path = @"path_to_your_zip_file";
NSString *destination = @"path_to_the_folder_where_you_want_it_unzipped";
[SSZipArchive unzipFileAtPath:path toDestination:destination];

非常简单。

答案 1 :(得分:6)

在Mac上,您可以使用内置的unzip命令行工具NSTask

- (void) unzip {
    NSFileManager* fm = [NSFileManager defaultManager];
    NSString* zipPath = @"myFile.zip";

    NSString* targetFolder = @"/tmp/unzipped"; //this it the parent folder
                                               //where your zip's content 
                                               //goes to (must exist)

    //create a new empty folder (unzipping will fail if any
    //of the payload files already exist at the target location)
    [fm createDirectoryAtPath:targetFolder withIntermediateDirectories:NO 
                                           attributes:nil error:NULL];


    //now create a unzip-task
    NSArray *arguments = [NSArray arrayWithObject:zipPath];
    NSTask *unzipTask = [[NSTask alloc] init];
    [unzipTask setLaunchPath:@"/usr/bin/unzip"];
    [unzipTask setCurrentDirectoryPath:targetFolder];
    [unzipTask setArguments:arguments];
    [unzipTask launch];
    [unzipTask waitUntilExit]; //remove this to start the task concurrently

}

这是一个快速而肮脏的解决方案。在现实生活中,您可能希望进行更多的错误检查,并查看unzip manpage的花哨参数。

答案 2 :(得分:3)

如果您只想解压缩文件,我建议使用NSTask来调用unzip(1)。在解压缩之前将文件复制到您控制的目录(可能在/ tmp中)可能很聪明。

答案 3 :(得分:2)

这是一个基于编码的简洁版本朋友1'

{{1}}

-d 指定目标目录,如果不存在则通过解压缩创建

-o 告诉解压缩覆盖现有文件(但不要删除过时的文件,所以要注意)

没有错误检查和内容,但它是一个简单快捷的解决方案。

答案 4 :(得分:2)

这是Swift 4版本,类似于Sven Driemecker的答案。

func unzipFile(at sourcePath: String, to destinationPath: String) -> Bool {
    let process = Process.launchedProcess(launchPath: "/usr/bin/unzip", arguments: ["-o", sourcePath, "-d", destinationPath])
    process.waitUntilExit()
    return process.terminationStatus <= 1
}

此实现返回一个布尔值,该布尔值确定该过程是否成功。即使遇到警告,也正在考虑该过程是否成功。

返回条件可以更改为return process.terminationStatus == 0,甚至不接受警告。

有关诊断的更多详细信息,请参见unzip docs

您还可以使用Pipe实例捕获流程的输出。

func unzipFile(at sourcePath: String, to destinationPath: String) -> Bool {
    let process = Process()
    let pipe = Pipe()

    process.executableURL = URL(fileURLWithPath: "/usr/bin/unzip")
    process.arguments = ["-o", sourcePath, "-d", destinationPath]
    process.standardOutput = pipe

    do {
        try process.run()
    } catch {
        return false
    }

    let resultData = pipe.fileHandleForReading.readDataToEndOfFile()
    let result = String (data: resultData, encoding: .utf8) ?? ""
    print(result)

    return process.terminationStatus <= 1
}

答案 5 :(得分:1)

尝试Zip.framework

答案 6 :(得分:1)

-openFile:NSWorkspace)是我所知道的最简单方法。