列出(仅)文件夹中的子文件夹——Swift 3.0 / iOS 10 [重复]
Posted
技术标签:
【中文标题】列出(仅)文件夹中的子文件夹——Swift 3.0 / iOS 10 [重复]【英文标题】:Listing (only) the subfolders within a folder -- Swift 3.0 / iOS 10 [duplicate] 【发布时间】:2017-03-20 01:20:21 【问题描述】:我正在尝试获取文件夹中所有子文件夹的列表(应用程序的 Documents
目录,在下面的示例中)。下面的代码成功地找到了文件夹中的所有内容(文件 + 文件夹两者),并且还找到了具有指定 .text
扩展名的文件,但我未能将结果缩小到只是的列表子目录。
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
以及文件夹,这不是我需要的 - 必须是仅目录,仅此而已。
另外,我并不想深入研究子文件夹中的子文件夹——我只在寻找“这里”的那些。
任何建议将不胜感激!
【问题讨论】:
多么糟糕的 API。为什么我们必须编写一堆额外丑陋的代码来做一些基本的事情,比如过滤掉目录或过滤掉文件? 【参考方案1】:您可以在第 6 行的 contentsOfDirectory
方法调用中将 URLResourceKey.isDirectoryKey
传递给 includingPropertiesForKeys
参数。这应该为您返回的所有 URL 返回该特定属性。然后,您可以检查该属性以查看每个 URL 是用于目录还是文件...
如果您想知道如何获取获取的 URL 的属性,请查看 resourceValues
类的 resourceValues
方法:)
【讨论】:
【参考方案2】:Fahim 的回答,特别是 URL
类的 resourceValues
方法,正是我所需要的;为了完整性和帮助以后发现这个问题的任何人,这里是最终代码,它得到了我想要的,同时保持相同的基本结构:
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)
【讨论】:
以上是关于列出(仅)文件夹中的子文件夹——Swift 3.0 / iOS 10 [重复]的主要内容,如果未能解决你的问题,请参考以下文章