列出(仅)文件夹中的子文件夹 -- Swift 3.0 / iOS 10
Listing (only) the subfolders within a folder -- Swift 3.0 / iOS 10
我正在尝试获取文件夹中所有子文件夹的列表(应用程序的 Documents
目录,在下面的示例中)。下面的代码成功地找到了文件夹中的所有内容(文件+文件夹),并且还找到了具有指定 .text
扩展名的文件,但我无法将结果缩小到 just 子目录列表。
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{ [=12=].deletingPathExtension().lastPathComponent }
r += "All file names:\n\(allFileNames)\n\n"
// filtering for text files -- also works fine
let textFiles = directoryContents.filter{ [=12=].pathExtension == "text" }
let textFileNames = textFiles.map{ [=12=].deletingPathExtension().lastPathComponent }
r += "text file list:\n\(textFileNames)\n\n"
// Look for folders within the folder -- fails, nothing returned
let subdirs = directoryContents.filter{ ![=12=].isFileURL }
let subdirNames = subdirs.map{ [=12=].deletingPathExtension().lastPathComponent }
r += "Subdirectories:\n\(subdirNames)\n\n"
textView.text = r
} catch let error as NSError {
print(error.localizedDescription)
我可以通过将过滤器设置为
来选择所有目录
[=13=].pathExtension == ""
但是 也 选取目录中没有扩展名的任何文件——即它正确地排除了 foo.bar
但错误地包含了文件 foo
与文件夹,这不是我需要的 - 必须是 仅 目录,仅此而已。
此外,我并不想深入了解子文件夹中的子文件夹——我只需要 "here" 即可。
如有任何建议,我们将不胜感激!
您可以在第 6 行的 contentsOfDirectory
方法调用中将 URLResourceKey.isDirectoryKey
传递给 includingPropertiesForKeys
参数。这应该 return 所有 [=20] 的特定属性=]ed URLs。然后,您可以检查属性以查看每个 URL 是否用于目录或文件 ...
如果您想知道如何获取获取的 URL 的属性,请查看 URL
class 的 resourceValues
方法: )
Fahim 的回答,特别是 URL
class 的 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{ ![=10=].hasDirectoryPath }
let onlyFileNamesStr = onlyFileNames.map { [=10=].lastPathComponent }
let subdirs = directoryContents.filter{ [=10=].hasDirectoryPath }
let subdirNamesStr = subdirs.map{ [=10=].lastPathComponent }
// now do whatever with the onlyFileNamesStr & subdirNamesStr
} catch let error as NSError {
print(error.localizedDescription)
}
我正在尝试获取文件夹中所有子文件夹的列表(应用程序的 Documents
目录,在下面的示例中)。下面的代码成功地找到了文件夹中的所有内容(文件+文件夹),并且还找到了具有指定 .text
扩展名的文件,但我无法将结果缩小到 just 子目录列表。
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{ [=12=].deletingPathExtension().lastPathComponent }
r += "All file names:\n\(allFileNames)\n\n"
// filtering for text files -- also works fine
let textFiles = directoryContents.filter{ [=12=].pathExtension == "text" }
let textFileNames = textFiles.map{ [=12=].deletingPathExtension().lastPathComponent }
r += "text file list:\n\(textFileNames)\n\n"
// Look for folders within the folder -- fails, nothing returned
let subdirs = directoryContents.filter{ ![=12=].isFileURL }
let subdirNames = subdirs.map{ [=12=].deletingPathExtension().lastPathComponent }
r += "Subdirectories:\n\(subdirNames)\n\n"
textView.text = r
} catch let error as NSError {
print(error.localizedDescription)
我可以通过将过滤器设置为
来选择所有目录[=13=].pathExtension == ""
但是 也 选取目录中没有扩展名的任何文件——即它正确地排除了 foo.bar
但错误地包含了文件 foo
与文件夹,这不是我需要的 - 必须是 仅 目录,仅此而已。
此外,我并不想深入了解子文件夹中的子文件夹——我只需要 "here" 即可。
如有任何建议,我们将不胜感激!
您可以在第 6 行的 contentsOfDirectory
方法调用中将 URLResourceKey.isDirectoryKey
传递给 includingPropertiesForKeys
参数。这应该 return 所有 [=20] 的特定属性=]ed URLs。然后,您可以检查属性以查看每个 URL 是否用于目录或文件 ...
如果您想知道如何获取获取的 URL 的属性,请查看 URL
class 的 resourceValues
方法: )
Fahim 的回答,特别是 URL
class 的 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{ ![=10=].hasDirectoryPath }
let onlyFileNamesStr = onlyFileNames.map { [=10=].lastPathComponent }
let subdirs = directoryContents.filter{ [=10=].hasDirectoryPath }
let subdirNamesStr = subdirs.map{ [=10=].lastPathComponent }
// now do whatever with the onlyFileNamesStr & subdirNamesStr
} catch let error as NSError {
print(error.localizedDescription)
}