如何在文件夹中快速获取所有文件的完整路径

时间:2019-10-17 03:01:27

标签: swift

我正在尝试递归获取所有文件路径,以便我可以对其进行处理,我相信它对许多人来说都是微不足道的,但是我还是不熟悉,请耐心等待。

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

谢谢

2 个答案:

答案 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)
}
相关问题