【问题标题】:Documents folder working in Simulator but not iPad - Swift 2.1文档文件夹在模拟器中工作,但在 iPad 中不工作 - Swift 2.1
【发布时间】: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


【解决方案1】:

为了避免由于一些琐碎的拼写错误而产生的错误。可能是以 NSURL 形式处理路径



    let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
    let documentsDir = paths[0]
    let url = NSURL(fileURLWithPath: documentsDir)
    url.URLByAppendingPathComponent("MyZipFiles")
    url.URLByAppendingPathComponent("docLibFiles")

【讨论】:

  • 再次欢呼@Allen,但我使用的解压缩代码使用字符串路径。我可以使用您的代码创建文件夹,但无论如何都必须切换回来。再加上文件夹的名称总是相同的,所以拼写错误应该不是问题
【解决方案2】:

我不确定为什么会出现最初的问题,但我的代码肯定过于复杂。我现在已经对其进行了排序,希望它可以在 swift 2.1 中对其他人有所帮助

class UnzipDocument {
let queue = NSOperationQueue() // BACKGROUND THREAD
    var imageArray = [UIImage]()
    var fileNameArray = [String]()
    var fileManager = NSFileManager.defaultManager()

let compressedFile = NSTemporaryDirectory().stringByAppendingString("MyZipFiles")
let uncompressedFolder = NSTemporaryDirectory().stringByAppendingString("MyUnzippedFiles")

func unzipData(objectData: NSManagedObject){ // THIS IS BASICALLY NSDATA FROM CORE DATA FOR ME
    let optData = NSData(data: objectData.valueForKey("image") as! NSData)
    let success = fileManager.fileExistsAtPath(uncompressedFolder) as Bool // CREATES THE FOLDER IF IT DOESNT EXIST
    if success == false {
        do {
            try! fileManager.createDirectoryAtPath(uncompressedFolder, withIntermediateDirectories: true, attributes: nil)
        }
    }
    optData.writeToFile(compressedFile, atomically: true)
    queue.addOperationWithBlock { () -> Void in
        let operation1 = NSBlockOperation(block: {
            SSZipArchive.unzipFileAtPath(self.compressedFile, toDestination: self.uncompressedFolder)
        })
        operation1.completionBlock = {
            if queue.operationCount == 0 {
                dispatch_async(dispatch_get_main_queue(), {
                    if queue.operationCount == 0 {
                        self.retrieveFiles()
                    }
                })
            }
        }
        queue.addOperation(operation1)
    }
}

func retrieveFiles() {
    do {
        let filelist = try fileManager.contentsOfDirectoryAtPath(uncompressedFolder)
        print(filelist)
        print("filename")
        for filename in filelist {
            self.fileNameArray.append(filename)
        }
    } catch let error as NSError  {
        print("Could not save \(error)")
    }
    do {
        for item in fileNameArray {
            print("item \(item)")
            let imagePath = uncompressedFolder.stringByAppendingString("/\(item)")
            imageArray.append(UIImage(contentsOfFile: imagePath)!)
        }
        print("filename array \(fileNameArray)")
        print("image array \(imageArray)")
        unzipDelegate!.unzipSet(imageArray)
    } catch {
    }
} 
}

并在使用后删除临时文件/文件夹,以便可以重复使用而不会留下任何旧文件

var fileManager = NSFileManager.defaultManager()
        let compressedFile = NSTemporaryDirectory().stringByAppendingString("MyZipFiles")
        let uncompressedFolder = NSTemporaryDirectory().stringByAppendingString("MyUnzippedFiles")
        do {
           try fileManager.removeItemAtPath(compressedFile)
              try fileManager.removeItemAtPath(uncompressedFolder)
        } catch let error as NSError  {
            print("Could not save \(error)")
        }

【讨论】:

    最近更新 更多