SSZipArchive"无法打开zip文件" - url.path不是解决方案

时间:2016-10-31 11:56:44

标签: ios swift swift3 ssziparchive

编辑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

3 个答案:

答案 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)