【问题标题】:Adding files to Array from Sub Folders将文件从子文件夹添加到数组
【发布时间】:2018-03-18 21:58:27
【问题描述】:

我正在使用以下代码将特定扩展名的文件从文件夹添加到数组。

self.fileArray = try FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys: nil).filter{ filterExtensions.contains($0.pathExtension) }

我需要从所选文件夹/驱动器内的所有子文件夹中添加文件。

我怎样才能做到这一点?

【问题讨论】:

    标签: swift xcode macos nsfilemanager


    【解决方案1】:

    你可以获取url资源键isRegularFileKey来检查枚举的url是否是一个常规文件。还可以设置跳过隐藏文件和打包后代的选项,否则它也会复制隐藏文件,如.DS_Store:

    let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    var files: [URL] = []
    FileManager.default.enumerator(at: documentsDirectory, includingPropertiesForKeys: [], options: [.skipsHiddenFiles, .skipsPackageDescendants])?.forEach {
        if let url = $0 as? URL, (try? url.resourceValues(forKeys: [.isRegularFileKey]))?.isRegularFile == true {
            files.append(url)
        }
    }
    

    你还可以获取枚举器返回的所有对象,有条件地将它们转换成一个URL数组,然后过滤满足条件的URL:

    if let files = (FileManager.default.enumerator(at: documentsDirectory, includingPropertiesForKeys: [], options: [.skipsHiddenFiles, .skipsPackageDescendants])?.allObjects as? [URL])?
        .filter({
          (try? $0.resourceValues(forKeys: [.isRegularFileKey]))?.isRegularFile == true
    }) {
       print(files.count)
    }
    

    【讨论】:

    • URL 将始终是目录 URL .. 因为我只允许在 NSOpenPanel 中选择目录。
    • 一个不同的问题......我的应用程序在处理大量图像时占用了 18GB 的​​内存......我应该明确地处理掉 NSImages 吗?
    • 其实你忘记了过滤器。
    • 过滤什么?您需要添加所有文件还是仅添加特定文件类型?
    【解决方案2】:

    你可以这样:

    let enumerator = try FileManager.default.enumerator(at: url, includingPropertiesForKeys: nil)!.allObjects
    
    self.fileArray = enumerator.filter { filterExtensions.contains(($0 as! URL).pathExtension) } as! [URL]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-07
      • 2019-09-08
      相关资源
      最近更新 更多