从子文件夹向Array添加文件

时间:2017-10-07 05:03:24

标签: swift xcode macos nsfilemanager

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

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

我需要添加所选文件夹/云端硬盘中所有子文件夹中的文件。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

你可以这样:

let enumerator = try FileManager.default.enumerator(at: url, includingPropertiesForKeys: nil)!.allObjects

self.fileArray = enumerator.filter { filterExtensions.contains(($0 as! URL).pathExtension) } as! [URL]

答案 1 :(得分: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)
}