Разархивирование файлов с помощью SSZipArchive — Swift

Я пытаюсь распаковать файл с помощью фреймворка 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, что бы это ни значило.

Я не могу найти документацию по фреймворку, поэтому я не совсем уверен, как заставить это работать.


person jackchmbrln    schedule 16.11.2015    source источник


Ответы (3)


Предположим, что вы реализовали все, а затем предоставили решение в несколько шагов.

  1. Перетащите папку 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)
    
person VRAwesome    schedule 17.11.2015
comment
Привет! Спасибо за ваш очень исчерпывающий ответ. К счастью, вчера вечером мне удалось решить проблему, но я забыл отметить ее здесь как таковую. Хотел бы я точно объяснить, как я это сделал, но, честно говоря, я думаю, что это был скорее метод проб и ошибок. Надеюсь, я не потратил ваше время зря, забыв сказать, что решил свою проблему! Спасибо! - person jackchmbrln; 17.11.2015
comment
@JackChamberlain Я тоже столкнулся с проблемой, как и вы. Не могли бы вы поделиться своим решением. - person onkar; 01.06.2016
comment
Я работаю с SSZipArchive, он отлично работает с распаковкой файла в симуляторе, но тот же код, если запустить его на устройство, не работает [stackoverflow.com/questions/54749503/ - person Singam madhukar; 19.02.2019
comment
Этот код использовался около 2 лет назад... теперь его необходимо пересмотреть в соответствии с последней версией iOS. - person VRAwesome; 19.02.2019

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 работает нормально.

person digitalHound    schedule 06.08.2018

Я надеюсь, что это помогает кому-то. AEXML или SwiftyXMLParser, SSZipArchive

 //путь к файлу // 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)
    }
person Vasya2014    schedule 02.09.2019