FileManager.default.enumerator不返回任何文件

use*_*010 2 ios swift

我正在使用XCode 8.2在swift 3.0.2中创建一个应用程序,我试图递归列出通过itunes与iOS应用程序共享的文件.

目前,以下代码有效:

let documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
print(documentsUrl.absoluteString)

do {
    let directoryContents = try FileManager.default.contentsOfDirectory(at: documentsUrl, includingPropertiesForKeys: nil, options: [])
    print(directoryContents)

} catch let error as NSError {
    print(error.localizedDescription)
}
Run Code Online (Sandbox Code Playgroud)

但是,这里的 contentsOfDirectory的文档声明该函数只执行URL的浅遍历并建议一个深度遍历URL的函数,即枚举器,其文档位于此处.

我正在使用以下代码段尝试使用深度遍历列出当前URL下的所有文件:

let documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
print(documentsUrl.absoluteString)

let dirContents = FileManager.default.enumerator(at: documentsUrl.resolvingSymlinksInPath(), includingPropertiesForKeys: nil, options: [])
print(dirContents.debugDescription)
while let element = dirContents?.nextObject() as? String {
    print(element)
}
Run Code Online (Sandbox Code Playgroud)

问题是,当第一个片段显示文件URL时,第二个片段不显示任何内容.

有人可以建议我该怎么做才能解决这个问题?我真的想使用第二个代码段而不是尝试使用第一个函数进行解决方法.

Mar*_*n R 5

FileManager 有两种方法可以获取目录枚举器:

第一个返回一个枚举字符串 (文件路径)的枚举器,第二个返回一个枚举URL的枚举器.

您的代码使用基于URL的枚举器,因此条件转换as? String失败并且不生成输出.

你必须URL改为:

if let dirContents = FileManager.default.enumerator(at: documentsUrl.resolvingSymlinksInPath(), includingPropertiesForKeys: nil) {

    while let url = dirContents.nextObject() as? URL {
        print(url.path)
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用for循环进行迭代:

if let dirContents = FileManager.default.enumerator(at: documentsUrl.resolvingSymlinksInPath(), includingPropertiesForKeys: nil) {

    for case let url as URL in dirContents {
        print(url.path)
    }
}
Run Code Online (Sandbox Code Playgroud)