Swift:如何解压缩捆绑包中未包含的文件?

时间:2019-02-15 08:52:30

标签: swift macos

我对Swift编程不是很熟悉,但是我需要在Swift中编写一个可以解压缩文件(然后启动程序)的小工具。我需要解压缩我的应用程序捆绑包中未包含的文件。它位于/Users/me/folder1/folder2/openjdk-11.0.2.zip

我尝试了库“ Zip”,“ ZipFoundation”和“ SSZipArchive”。从到目前为止的内容来看,我认为尝试过的库需要将zip文件放在应用程序捆绑包中,但我不确定。

我尝试使用“ Zip”:

_ = try Zip.quickUnzipFile(URL(string: openjdkZipUrl!.relativePath)!)

我尝试使用“ ZipFoundation”:

let fileManager = FileManager()
let archive = openjdkZipUrl
let destinationURL = openjdkFolderUrl
do {
  try fileManager.unzipItem(at: archive.url, to: destinationURL)
} catch {

}

ZipFoundation告诉我“类型'FileManager'的值没有成员'unzipItem'”,但是我使用import Foundation导入了它。我的Podfile中也有它(和其他库)。

我尝试使用“ SSZipArchive”:

let success = SSZipArchive.unzipFile(atPath: openjdkZipUrl!.path, toDestination: openjdkFolderUrl!.path)

使用的路径是

let openjdkZip = "file:///Users/" + user + "/folder1/folder2/openjdk-11.0.2.zip"
let openjdkZipUrl = URL(string: openjdkZip)

let openjdkFolder = "file:///Users/" + user + "/folder1/folder2/openjdk-11.0.2"
let openjdkFolderUrl = URL(string: openjdkFolder)

捆绑包中不包含zip文件确实是一个问题吗?有人可以告诉我我做错了什么吗? 预先感谢

1 个答案:

答案 0 :(得分:0)

@trojanfoe在评论中提到:

  

Mac应用程序默认情况下为沙箱,这意味着它们无法访问用户的文件,除非他们通过让用户打开文件/文件夹来请求。您应该确保已为您的应用程序将其关闭,但是您正在测试文件是否存在,如果成功,则好像沙箱未打开?

我查看了项目中的.entitlements文件,发现“应用程序沙箱”设置为“是”。我将其设置为“否”,效果很好。

似乎您可以在沙盒模式下检查文件(就像我对我的条件所做的那样),但是在尝试解压缩文件时无法访问它们。

再次感谢@trojanfoe:)