我正在尝试使用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
,无论这意味着什么。
我找不到该框架的任何文档,所以我不完全确定如何使这个工作
答案 0 :(得分:6)
假设您已实施所有内容,然后在几个步骤中提供解决方案
从您可以从here下载的演示中拖动SSZipArchive
文件夹。
如果您已经有#import "SSZipArchive.h”
,请yourProjectname-Bridging-Header.h
。否则,请创建上面提到的新头文件。
如果要使用委托方法,请将委托设置为类
class YourViewController: UIViewController, SSZipArchiveDelegate {.......
创建zip表单文件夹我已将示例文件夹添加到项目(主程序包)
首先在文档目录中创建要保存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)
}
}
现在创建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)
用于解压缩文档目录中的文件创建文件夹(要保存的位置)
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)
}
}
解压缩文件夹
SSZipArchive.unzipFileAtPath(archivePath, toDestination:destPath, delegate:self)
打印您的路径,您可以检查您的文件是否已保存
print(zipPath)
答案 1 :(得分:1)
我希望这对某人有帮助。 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)
}
答案 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可以正常工作。