使用SSZipArchive解压缩文件 - Swift

时间:2015-11-16 11:44:59

标签: ios swift ssziparchive

我正在尝试使用SSZipArchive框架解压缩文件。

let unzipper = SSZipArchive.unzipFileAtPath(String(document), toDestination: String(documentsUrl))

这就是我正在尝试解压缩文件,这是文件的路径:

unzipFileAtPath - Document at path: file:///private/var/mobile/Containers/Data/Application/94ADDB12-78A2-4798-856D-0626C41B7AC2/Documents/tSOUTrIayb.zip false

我正试图将其解压缩到这条道路上:

NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first!

不幸的是,它似乎没有用,每次都没有新的保存到我打印出来的文件目录中。我还打印'unzipper'变量,它只打印false,无论这意味着什么。

我找不到该框架的任何文档,所以我不完全确定如何使这个工作

3 个答案:

答案 0 :(得分:6)

假设您已实施所有内容,然后在几个步骤中提供解决方案

  1. 从您可以从here下载的演示中拖动SSZipArchive文件夹。

  2. 如果您已经有#import "SSZipArchive.h”,请yourProjectname-Bridging-Header.h。否则,请创建上面提到的新头文件。

  3. 如果要使用委托方法,请将委托设置为类

    class YourViewController: UIViewController, SSZipArchiveDelegate {.......
    
  4. 创建zip表单文件夹我已将示例文件夹添加到项目(主程序包)

  5. 首先在文档目录中创建要保存zip文件的文件夹

    var paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
    let documentsDir = paths[0]
    let zipPath =  documentsDir.stringByAppendingString("/MyZipFiles") // My folder name in document directory
    
    let fileManager = NSFileManager.defaultManager()
    
    let success = fileManager.fileExistsAtPath(zipPath) as Bool
    
    if success == false {
    
        do {
    
            try! fileManager.createDirectoryAtPath(zipPath, withIntermediateDirectories: true, attributes: nil)
        }
    }
    
  6. 现在创建zip文件

    var inputPath = NSBundle.mainBundle().resourcePath
    inputPath = inputPath!.stringByAppendingString("/Sample") // My folder which already put into project
    
    let archivePath = zipPath.stringByAppendingString(“/Demo.zip") // Sample folder is going to zip with name Demo.zip
    SSZipArchive.createZipFileAtPath(archivePath, withContentsOfDirectory:inputPath)
    
  7. 用于解压缩文档目录中的文件创建文件夹(要保存的位置)

    let destPath = zipPath.stringByAppendingString("/Hello")
    let fileManager = NSFileManager.defaultManager()
    
    let success = fileManager.fileExistsAtPath(destPath) as Bool
    
    if success == false {
    
        do {
    
            try! fileManager.createDirectoryAtPath(destPath, withIntermediateDirectories: true, attributes: nil)
        }
    }
    
  8. 解压缩文件夹

    SSZipArchive.unzipFileAtPath(archivePath, toDestination:destPath, delegate:self)
    
  9. 打印您的路径,您可以检查您的文件是否已保存

    print(zipPath)
    

答案 1 :(得分:1)

我希望这对某人有帮助。 AEXMLSwiftyXMLParserSSZipArchive

 //путь к файлу // path to file
    guard let bookPath = Bundle.main.path(forResource: "FileName", ofType: "epub") else {  return }
    //путь к хранилищу телефона // path to storage 
    let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0]
    let fileManager = FileManager.default
    let bookName = bookPath.lastPathComponent // название файла // name of file
    let bookBasePath = paths.appendingPathComponent(bookName) // ссылка к хранилищу телефона // path to Directory 

    do {
        if !fileManager.fileExists(atPath: bookBasePath) {
            SSZipArchive.createZipFile(atPath: bookPath, withContentsOfDirectory:bookBasePath) // создание архива // create zip
            SSZipArchive.unzipFile(atPath: bookPath, toDestination: bookBasePath, delegate: self) // распаковка архива // unzip 
            try FileManager.default.createDirectory(atPath: bookBasePath, withIntermediateDirectories: true, attributes: nil) // создание директории с архивом // create Directory
        }

        if fileManager.fileExists(atPath: bookBasePath){
            // get xml
            let containerPath = "META-INF/container.xml"
            let containerData = try Data(contentsOf: URL(fileURLWithPath: bookBasePath).appendingPathComponent(containerPath), options: .alwaysMapped) // получение xml файла из директории
            print(containerData)
           // parse xml ...
        } else {
            print("file no exists")
        }
    } catch {
        print(error)
    }

答案 2 :(得分:0)

TLDR;检查您的源路径和目标路径不是以file://前缀开头。

更多详细信息...

我遇到了同样的问题,SSZipArchive将运行,success变量将打印为false,没有调用任何委托,也没有从SSZipArchive打印调试消息。

我正在这样运行它:

let sourcePath = sourceURL.absoluteString
let destPath = destURL.absoluteString

print("Source: \(sourcePath)")
print("Dest: \(destPath)")

let success = SSZipArchive.unzipFile(atPath: sourcePath, toDestination: destPath, delegate: self)
print("ZipArchive - Success: \(success)")

我的日志语句正在打印出来

Source: file:///var/containers/Bundle/Application/longAppIDHere/testApp.app/Bundle1.zip
Dest: file:///var/mobile/Containers/Data/Application/longAppIDHere/Library/Application Support/testFolder/
ZipArchive - Success: false

我将路径构造函数更改为:

let sourcePath = sourceURL.relativePath
let destPath = destURL.relativePath

现在SSZipArchive可以正常工作。