swift:从文档目录加载多个文件

Posted

技术标签:

【中文标题】swift:从文档目录加载多个文件【英文标题】:swift: Load multiple files from documents directory 【发布时间】:2018-07-26 08:04:28 【问题描述】:

我在文档目录中有许多文件的文件夹。在我的文件夹中,我有不同扩展名的文件(jpg、png、mp3、zip)。在我的代码中,我有stringArray。我想在someArray 中加载所有文件,然后在someArray 中添加具有.png 扩展名的文件stringArray 怎么做?

可以这样做吗?或者我应该找到另一种从文档目录加载多个文件的方法?

我为Load multiple images from the folder or directory. - Swift 4找到answer

我尝试使用来自answer的这段代码:

func loadImagesFromAlbum(folderName:String) -> [String]

        let nsDocumentDirectory = FileManager.SearchPathDirectory.documentDirectory
        let nsUserDomainMask    = FileManager.SearchPathDomainMask.userDomainMask
        let paths               = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true)
        var theItems = [String]()
        if let dirPath          = paths.first
        
            let imageURL = URL(fileURLWithPath: dirPath).appendingPathComponent(folderName)

            do 
                theItems = try FileManager.default.contentsOfDirectory(atPath: imageURL.path)
                return theItems
             catch let error as NSError 
                print(error.localizedDescription)
                return theItems
            
        
        return theItems
    

但我无法从theItems 获取文件。因为theItems 它是一个字符串数组。我做错了什么?如何从loadImagesFromAlbum获取文件?

我尝试使用此代码:

images = loadImagesFromAlbum(folderName: "/folder1")

但这对我没有帮助。我只得到名字。但我需要获取文件。

更新

我使用此代码从documents directory 加载图像:

        let nsDocumentDirectory = FileManager.SearchPathDirectory.documentDirectory
        let nsUserDomainMask    = FileManager.SearchPathDomainMask.userDomainMask
        let paths               = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true)
        if let dirPath          = paths.first
        
            let imageURL = URL(fileURLWithPath: dirPath).appendingPathComponent("/folder1/1.png")
            myImageView.image = UIImage(contentsOfFile: imageURL.path)
        

但我需要从/folder1 加载 100 张图片到var images = [String]()。因为我用var images = [String]()来展示图片:contentVC.imageName = images[index] // and etc...

如果我需要添加 40-100 张图片,我上面使用的代码不是很方便。

更新 1

我有这段代码可以从我的项目中加载图像并显示它:

class PageViewController: UIViewController 

override func viewDidLoad() 
        super.viewDidLoad()

            for page in 1...pageNumber[indexPage] 
                images.append("page\(page).png")

            


func getContentViewController(withIndex index: Int) -> ContentViewController? 
        if index < images.count
            let contentVC = self.storyboard?.instantiateViewController(withIdentifier: "ContentViewController") as! ContentViewController
            contentVC.itemIndex = index
            contentVC.imageName = images[index]

            return contentVC
        

        return nil
    


import UIKit

class ContentViewController: UIViewController 

    @IBOutlet weak var imageView: UIImageView!
    var itemIndex: Int = 0
    var imageName: String?

    override func viewDidLoad() 
        super.viewDidLoad()

        if let currentImage = imageName
            imageView.image = UIImage(named: currentImage)

        

    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

但我需要从文档目录加载图像并显示它。怎么做?

【问题讨论】:

不清楚你在问什么。您不能将 files 加载到数组中。您可以将文件(其Data 表示)的 contents 加载到数组中。 contentsOfDirectory 返回一个字符串路径数组,它们是磁盘上文件的位置。 @vadian 我更新了问题。在更新标题下方添加新代码。 目前还不清楚。你在谈论 3 个不同的东西:文件路径是 String,图像是 UIImage - 你不能将 UIImage 附加到 String 数组 - 但名称 imageName 暗示它只需要文件文件路径的名称(最后一个路径组件)。 @vadian 我更新了我的问题。我在 Update 1 标题下方提出了新问题。如果我的问题不清楚,请告诉我。 【参考方案1】:

如果我正确理解您的问题,您希望在 Documents 文件夹的特定文件夹中加载特定名称的图像。

请试试这个,该方法有两个参数,文件名(带扩展名!)和文件夹名,如果找不到或无法创建图像,则返回UIImagenil

func loadImage(withName name : String, from folderName: String) -> UIImage? 
    do 
        let documentsFolderURL = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
        let imageURL = documentsFolderURL.appendingPathComponent(folderName).appendingPathComponent(name)
        let data = try Data(contentsOf: imageURL)
        return UIImage(data: data)
     catch 
        return nil
    

使用contentsOfDirectory 获取所有文件路径没有任何好处,因为无论如何您都必须一一加载图像数据。

【讨论】:

谢谢!此代码工作正常。我在 contentViewController 中使用此代码 let currentImage = loadImage(withName: imageName!, from: "/folder") imageView.image = currentImage。它的用法正确吗? 是的,但您不需要前导 /appendingPathComponent 处理路径分隔符。

以上是关于swift:从文档目录加载多个文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 中使用多个部分的骨架加载?

从应用程序的文档目录加载本地 html 文件 swift wkwebview

从 Document 目录加载多个图像时 UICollectionView 卡住

如何从 macOS Swift 上的文档目录加载图像?

Swift - 多个 TableView 复选标记 - 保存和加载选择

从 Nib 加载 NSView 的多个实例