列出(仅)文件夹中的子文件夹 - Swift 3.0 / iOS 10

时间:2017-03-20 01:20:22

标签: ios swift subdirectory

我正在尝试获取文件夹中所有子文件夹的列表(应用程序的Documents目录,在下面的示例中)。下面的代码成功找到了文件夹中的所有内容(文件+文件夹),并且还查找了具有指定.text扩展名的文件,但是我没有将结果缩小到只是 a子目录列表。

let filemgr = FileManager.default
var dirPaths = filemgr.urls(for: .documentDirectory, in: .userDomainMask)
myDocumentsDirectory = dirPaths[0]

var r = "Directory Listing:\n------------------\n" // r = will be returned (or displayed in this case)

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

    // all files -- works fine
    let allFileNames = directoryContents.map{ $0.deletingPathExtension().lastPathComponent }
    r += "All file names:\n\(allFileNames)\n\n"

    // filtering for text files -- also works fine
    let textFiles = directoryContents.filter{ $0.pathExtension == "text" }
    let textFileNames = textFiles.map{ $0.deletingPathExtension().lastPathComponent }
    r += "text file list:\n\(textFileNames)\n\n"

    // Look for folders within the folder -- fails, nothing returned            
    let subdirs = directoryContents.filter{ !$0.isFileURL }
    let subdirNames = subdirs.map{ $0.deletingPathExtension().lastPathComponent }

    r += "Subdirectories:\n\(subdirNames)\n\n"
    textView.text = r

} catch let error as NSError {
    print(error.localizedDescription)

我可以通过将过滤器设置为

来获取所有目录
$0.pathExtension == ""

选择目录中没有扩展名的任何文件 - 即它正确排除了foo.bar但错误地包含了文件foo以及文件夹,以及这不是我需要的 - 必须 目录&仅此而已。

另外,我不是要深入研究子文件夹中的子文件夹 - 只是“这里”的内容正是我正在寻找的。

任何建议都将不胜感激!

2 个答案:

答案 0 :(得分:5)

您可以将URLResourceKey.isDirectoryKey传递到第6行的includingPropertiesForKeys方法调用中的contentsOfDirectory参数。这应该返回所有返回的网址的特定属性。然后,您可以检查属性以查看每个URL是用于目录还是文件...

如果您想了解如何获取已获取网址的属性,请查看resourceValues类的URL方法:)

答案 1 :(得分:1)

Fahim的回答,特别是resourceValues类的URL方法,是我所需要的;为了完整性和为了帮助后来发现这个问题的人,这里的最终代码正是我想要的,同时保持相同的基本结构:

let filemgr = FileManager.default
var dirPaths = filemgr.urls(for: .documentDirectory, in: .userDomainMask)
myDocumentsDirectory = dirPaths[0]

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

    let onlyFileNames = directoryContents.filter{ !$0.hasDirectoryPath }
    let onlyFileNamesStr = onlyFileNames.map { $0.lastPathComponent }

    let subdirs = directoryContents.filter{ $0.hasDirectoryPath }
    let subdirNamesStr = subdirs.map{ $0.lastPathComponent }

    // now do whatever with the onlyFileNamesStr & subdirNamesStr
} catch let error as NSError {
    print(error.localizedDescription) 
}