编辑2:
我尝试了来自marmelroy(https://github.com/marmelroy/Zip)的Zip,但是在zip文件中创建了ZipArchive也失败了。
然后我用Zip创建了另一个zip文件,这个可以解压缩。
对我来说ZipArchive似乎有问题。我将使用Zip代替它,这就是我...
答案的答案!!
结束编辑2.
我需要解压缩某些文件,所以我手动安装了SSZipArchive。
将所有3个文件夹(SSZipArchive,minizip,aes)复制到项目中,在我的bridging.h中添加了#import "ZipArchive.h"
,所有构建都很好。
编辑:
建议使用迦太基,但行为相同。
结束编辑。
我使用XCode8 / Swift 3
在没有解压缩任何文件的几次测试之后,我使用SSZipArchive创建了自己的zip。
let file = "file.txt"
let text = "some text" //just a text
let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
let path = dir?.appendingPathComponent(file)
//writing
do {
try text.write(to: path!, atomically: false, encoding: String.Encoding.utf8)
}
catch {
print("Failed writing")
}
这里我打印()Documentsdirectory:[" file.txt"]
let zipPath = tempZipPath() //tempZipPath is taken from the SSZipArchiveExample except it uses DocumentDirectory instead of Cache...
print("zipPath: \(zipPath)")
print zipPath:/var/mobile/Containers/Data/Application/EB439A61-07B9-4910-BF28-03E85C50B292/Documents/93428A1B-E5B6-434F-B049-632B7519B126.zip
let success = SSZipArchive.createZipFile(atPath: zipPath, withContentsOfDirectory: (dir?.absoluteString)!)
if success {
print("zipped")
} else {
print(" NOT zipped")
}
Documentsdirectories条目:[" 93428A1B-E5B6-434F-B049-632B7519B126.zip"," file.txt"]
// this is again taken from the original Example
guard let unzipPath = tempUnzipPath() else {
return
}
print("unzipPath: \(unzipPath)")
print unzipPath:/ var / mobile / Containers / Data / Application / EB439A61-07B9-4910-BF28-03E85C50B292 / Documents / E4FC7DE6-F21B-46D8-9953-DCBF86E2268E
阅读这个新目录的条目:[]
let filePath = zipPath
var fileSize : UInt64 = 0
do {
let attr : NSDictionary? = try FileManager.default.attributesOfItem(atPath: filePath) as NSDictionary?
if let _attr = attr {
fileSize = _attr.fileSize();
print("fileSize: \(fileSize)")
}
} catch {
print("Error: \(error)")
}
这写22
。我也尝试读取工作正常的zip文件
从这一部分开始我绝望地做了什么
let url = URL(fileURLWithPath: zipPath)
print("url: \(url)")
print("url.path: \(url.path)")
print("url.absoluteString: \(url.absoluteString)")
print("url.absoluteURL: \(url.absoluteURL)")
print("url.absoluteURL.absoluteString: \(url.absoluteURL.absoluteString)")
这些线的输出看起来对我有好处:
url:file:///var/mobile/Containers/Data/Application/EB439A61-07B9-4910-BF28-03E85C50B292/Documents/93428A1B-E5B6-434F-B049-632B7519B126.zip
url.path:/var/mobile/Containers/Data/Application/EB439A61-07B9-4910-BF28-03E85C50B292/Documents/93428A1B-E5B6-434F-B049-632B7519B126.zip
url.absoluteString:file:///var/mobile/Containers/Data/Application/EB439A61-07B9-4910-BF28-03E85C50B292/Documents/93428A1B-E5B6-434F-B049-632B7519B126.zip
url.absoluteURL:file:///var/mobile/Containers/Data/Application/EB439A61-07B9-4910-BF28-03E85C50B292/Documents/93428A1B-E5B6-434F-B049-632B7519B126.zip
url.absoluteURL.absoluteString:file:///var/mobile/Containers/Data/Application/EB439A61-07B9-4910-BF28-03E85C50B292/Documents/93428A1B-E5B6-434F-B049-632B7519B126.zip
然后我尝试了所有这些(当然是字符串。不允许使用网址)
var success2 = SSZipArchive.unzipFile(atPath: zipPath, toDestination: unzipPath)
if !success2 {
print("zipPath")
}
success2 = SSZipArchive.unzipFile(atPath: url.path, toDestination: unzipPath)
if !success2 {
print("url.path")
}
success2 = SSZipArchive.unzipFile(atPath: url.absoluteString, toDestination: unzipPath)
if !success2 {
print("url.absoluteString")
}
success2 = SSZipArchive.unzipFile(atPath: url.absoluteURL.path, toDestination: unzipPath)
if !success2 {
print("url.absoluteURL.path")
}
它会打印每一行,所以它们都失败了。最后是#34; long"使用unipFileAtPath的方法。我也用zipPath试过这个,... 所有相同的结果。
do {
success2 = try SSZipArchive.unzipFileAtPath(url.path, toDestination: unzipPath, overwrite: true, password: nil, delegate: nil)
if !success2 {
return
}
} catch {
print("error \(error)")
print("error \(error.localizedDescription)")
}
错误错误域= SSZipArchiveErrorDomain代码= -1"无法打开zip文件" UserInfo = {NSLocalizedDescription =无法打开zip文件} 错误无法打开zip文件
这里以func来获取路径字符串。顺便说一句。我修改了tempZipPath,因此返回一个URL或一个URL.path
但是嘿:我很绝望
func tempZipPath() -> String {
var path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
path += "/\(UUID().uuidString).zip"
return path
}
func tempUnzipPath() -> String? {
var path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
path += "/\(UUID().uuidString)"
let url = URL(fileURLWithPath: path)
do {
try FileManager.default.createDirectory(at: url, withIntermediateDirectories: true, attributes: nil)
} catch {
return nil
}
return url.path
}
有什么建议吗?是否需要考虑手动安装SSZipArchive?
提示"使用.path而不是.absoluteString"正如你在上面所看到的那样,对我没有用。
绝望的tartsigam答案 0 :(得分:1)
我也有问题。如果您使用url.path
而不是url.absolutString
,则可以使用。
感谢vadian的提示!
答案 1 :(得分:0)
在我的情况下,使用ObjC和手动安装,我忘记添加以下GCC_PREPROCESSOR_DEFINITIONS:HAVE_INTTYPES_H HAVE_PKCRYPT HAVE_STDINT_H HAVE_WZAES HAVE_ZLIB $(继承)
添加了这些GCC_PREPROCESSOR_DEFINITIONS后,它可以按预期工作。
答案 2 :(得分:0)
在使用zip之前,请不要提取文件并返回false。
将其放入“构建设置” / Apple CLang处理/预处理器宏后,Debug e Release在这里起作用
GCC_PREPROCESSOR_DEFINITIONS: HAVE_INTTYPES_H HAVE_PKCRYPT HAVE_STDINT_H HAVE_WZAES HAVE_ZLIB MZ_ZIP_NO_SIGNING $(inherited)