我使用以下代码将特定扩展名的文件从文件夹添加到数组中。
self.fileArray = try FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys: nil).filter{ filterExtensions.contains($0.pathExtension) }
我需要添加所选文件夹/云端硬盘中所有子文件夹中的文件。
我怎样才能做到这一点?
答案 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)
}