我正在尝试递归获取所有文件路径,以便我可以对其进行处理,我相信它对许多人来说都是微不足道的,但是我还是不熟悉,请耐心等待。
let enumerator = FileManager.default.enumerator(atPath: arguments.get(fileName)![0])
while let element = enumerator?.nextObject() as? String {
print(element)
}
上面的代码仅给出了没有真实完整路径的文件名列表
file1.txt
file2.txt
file3.txt
结构是
-- folder1
--file1.txt
--file2.txt
-- folder2
--file3.txt
但是file3.txt实际上在folder1 / folder2中
我如何迅速得到这样的东西?
/full/path/folder1/file1.txt
/full/path/folder1/file2.txt
/full/path/folder1/folder2/file3.txt
谢谢
答案 0 :(得分:0)
假设fm
是我们的文件管理器,而url
是我们的目录URL。
let dir = fm.enumerator(at:url, includingPropertiesForKeys: nil)!
for case let f as URL in dir {
print(f) // or its absolute path or whatever
}
这是一个测试:
let fm = FileManager.default
let docs = fm.urls(for: .documentDirectory, in: .userDomainMask)[0]
let f1 = docs.appendingPathComponent("f1.txt")
try? "howdy".write(to: f1, atomically: true, encoding: .utf8)
let subdir = docs.appendingPathComponent("subdir")
try? fm.createDirectory(at: subdir, withIntermediateDirectories: true, attributes: nil)
let f2 = subdir.appendingPathComponent("f2.txt")
try? "hello".write(to: f2, atomically: true, encoding: .utf8)
let dir = fm.enumerator(at:docs, includingPropertiesForKeys: nil)!
for case let f as URL in dir where f.pathExtension == "txt" {
print(f) // or its absolute path or whatever
}
结果:
file:///.../Documents/f1.txt
file:///.../Documents/subdir/f2.txt
我相信符合您的要求。
答案 1 :(得分:0)
您可以获取NSEnumerator
allObjects
属性,将其从[Any]
投射到[URL]
,然后使用compactMap
返回所有不是目录的文件URL,并且没有隐藏:
let documentsDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
// check if the url is a directory
if documentsDir.hasDirectoryPath {
// get all non directory paths from your enumerator
let contents = (FileManager.default.enumerator(at: documentsDir, includingPropertiesForKeys: nil, options: .skipsHiddenFiles)?.allObjects as? [URL])?.lazy.compactMap {
$0.hasDirectoryPath ? nil : $0.path
} ?? []
print(contents.count)
}