我正在使用以下代码枚举用户选择的路径,并使用具有特定扩展名的文件名填充数组。
let enumerator:FileManager.DirectoryEnumerator = fileManager.enumerator(atPath: path)!
while let element = enumerator.nextObject() as? String {
if ((element.hasSuffix("jpg"))||element.hasSuffix("playground")) {
if(!self.yourArray.contains(element))
{
self.yourArray.append(element)
}
}
我需要获取完整的文件路径才能将文件添加到处理队列中。
此外,我如何阻止枚举器探索子目录。
请指教。
答案 0 :(得分:1)
首先使用与URL相关的API,它更通用。
与DirectoryEnumerator
contentsOfDirectory
不同,返回目录中没有子目录的所有项目的URL。
一个简单的解决方案是一系列路径扩展和filter
函数
let url = URL(fileURLWithPath: "/Users/myUser/Pictures/")
let filterExtensions = ["jpg", "playground"]
do {
self.yourArray = try FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys: nil)
.filter{ filterExtensions.contains($0.pathExtension) }
print(yourArray)
} catch {
print(error)
}
请注意yourArray
将包含网址,而不是字符串路径。
答案 1 :(得分:0)
这将允许您获取所有子目录中的所有文件,而不仅仅是一级。将您提供给 fileManager.enumerator(atPath: path)!
的路径转换为如下所示的 URL,然后将目录枚举器提供的路径附加到此 URL:
let directoryUrl = URL(fileURLWithPath: path)
let pathUrl = directoryUrl.appendingPathComponent(element)
如果我在写你的代码,我也会做一些重命名/改进:
func main() {
// Set up your variables
let fileManager = FileManager.default
let path = "/Users/username"
var files = [URL]() // Using a URL instead of a path.
let enumerator: FileManager.DirectoryEnumerator = fileManager.enumerator(atPath: path)!
let directoryUrl = URL(fileURLWithPath: path)
while let filepath = enumerator.nextObject() as? String {
if ((filepath.hasSuffix(".jpg")) || filepath.hasSuffix(".playground")) {
let pathUrl = directoryUrl.appendingPathComponent(filepath)
files.append(pathUrl)
}
}
}