我有一个压缩文件,我想提取它的内容。我应该做些什么来实现它。是否有任何框架可以解压缩cocoa框架或目标C中的文件。
答案 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)
答案 6 :(得分:1)
-openFile:
(NSWorkspace
)是我所知道的最简单方法。