【发布时间】:2023-07-09 21:54:01
【问题描述】:
以下代码将图像文件夹解压缩到我创建的文件夹中。然后循环遍历它并将名称添加到数组中,然后循环遍历该数组并将这些文件名检索到图像数组中。
它在模拟器上完美运行,但是当我在 iPad 上执行时数据为空,它什么也没打印出来。我只能假设该文件夹不可访问或在解压缩完成之前正在被搜索,但它不应该,因为我正在使用带有完成块的 NSOperationQueue。
func unzipData(objectData: NSManagedObject) {
var paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
let documentsDir = paths[0]
let zipPath = documentsDir.stringByAppendingString("MyZipFiles")
let folderPath = documentsDir.stringByAppendingString("/docLibFiles") // My folder name in document directory
var optData = NSData(data: objectData.valueForKey("image") as! NSData)
print(objectData.valueForKey("imageUrl") as! String)
optData.writeToFile(zipPath, atomically: true)
let success = fileManager.fileExistsAtPath(zipPath) as Bool
if success == false {
do {
try! fileManager.createDirectoryAtPath(folderPath, withIntermediateDirectories: true, attributes: nil)
}
}
queue.addOperationWithBlock { () -> Void in
let operation1 = NSBlockOperation(block: {
let unZipped = SSZipArchive.unzipFileAtPath(zipPath, toDestination: folderPath)
})
operation1.completionBlock = {
dispatch_async(dispatch_get_main_queue(), {
if queue.operationCount == 0 {
self.retrieveFiles()
}
})
}
queue.addOperation(operation1)
}
}
func getDocumentsURL() -> NSURL {
let documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
return documentsURL
}
func fileInDocumentsDirectory(filename: String) -> String {
let fileURL = getDocumentsURL().URLByAppendingPathComponent(filename)
return fileURL.path!
}
func retrieveFiles() {
var paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
let documentsDir = paths[0]
let zipPath = documentsDir.stringByAppendingString("MyZipFiles")
let folderPath = documentsDir.stringByAppendingString("/docLibFiles") // My folder name in document directory
do {
let filelist = try fileManager.contentsOfDirectoryAtPath(folderPath)
print(filelist)
print("filename")
for filename in filelist {
fileNameArray.append(filename)
}
} catch let error as NSError {
print("Could not save \(error)")
}
do {
for item in fileNameArray {
print("item \(item)")
let imagePath = fileInDocumentsDirectory("docLibFiles/\(item)")
imageArray.append(UIImage(contentsOfFile: imagePath)!)
}
print("filename array \(fileNameArray)")
print("image array \(imageArray)")
unzipDelegate!.unzipSet(imageArray)
}
}
【问题讨论】:
-
只是快速浏览您的代码,可能您需要在此行中的 MyZipFiles 之前添加一个斜杠:let zipPath = documentsDir.stringByAppendingString("/MyZipFiles")
-
欢呼@Allen,这有点奇怪。我认为有人可能会注意到这一点(该位实际上没有做任何事情,它不会创建文件夹或文件,但解压缩仅在我将其保留时才有效,我认为它需要一个不一样的指针作为其现有位置)
-
播放字符串路径可能会导致错误,并带有轻微的拼写错误。可能是以 NSURL 形式处理路径,请以我的回答作为参考。
标签: swift ios-simulator unzip nsfilemanager documents