使用 Swift 获取子目录
Get Subdirectories using Swift
我试图只获取子目录。这是我的数据结构。
根/
- 一个/
- 1.txt
- 2.txt
- b/
- 3.txt
- 4.txt
我想获取特定文件夹(根)中的目录。我在根文件路径中使用枚举器:
let enumerator = NSFileManager.defaultManager().enumeratorAtPath(filePath)
for element in enumerator! {
print(element)
}
但是,它会遍历根目录中的每个文件。我怎样才能得到子目录 (a&b) ?
没有必要使用深度枚举。只需获取 contentsOfDirectoryAtURL 并过滤返回的 url,即目录。
Xcode 11.4• Swift 5.2
extension URL {
func subDirectories() throws -> [URL] {
// @available(macOS 10.11, iOS 9.0, *)
guard hasDirectoryPath else { return [] }
return try FileManager.default.contentsOfDirectory(at: self, includingPropertiesForKeys: nil, options: [.skipsHiddenFiles]).filter(\.hasDirectoryPath)
}
}
用法:
do {
let documentsDirectory = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let url = documentsDirectory.appendingPathComponent("pictures", isDirectory: true)
if !FileManager.default.fileExists(atPath: url.path) {
try FileManager.default.createDirectory(at: url, withIntermediateDirectories: false, attributes: nil)
}
let subDirs = try documentsDirectory.subDirectories()
print("sub directories", subDirs)
subDirs.forEach { print([=11=].lastPathComponent) }
} catch {
print(error)
}
我试图只获取子目录。这是我的数据结构。
根/
- 一个/
- 1.txt
- 2.txt
- b/
- 3.txt
- 4.txt
我想获取特定文件夹(根)中的目录。我在根文件路径中使用枚举器:
let enumerator = NSFileManager.defaultManager().enumeratorAtPath(filePath)
for element in enumerator! {
print(element)
}
但是,它会遍历根目录中的每个文件。我怎样才能得到子目录 (a&b) ?
没有必要使用深度枚举。只需获取 contentsOfDirectoryAtURL 并过滤返回的 url,即目录。
Xcode 11.4• Swift 5.2
extension URL {
func subDirectories() throws -> [URL] {
// @available(macOS 10.11, iOS 9.0, *)
guard hasDirectoryPath else { return [] }
return try FileManager.default.contentsOfDirectory(at: self, includingPropertiesForKeys: nil, options: [.skipsHiddenFiles]).filter(\.hasDirectoryPath)
}
}
用法:
do {
let documentsDirectory = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let url = documentsDirectory.appendingPathComponent("pictures", isDirectory: true)
if !FileManager.default.fileExists(atPath: url.path) {
try FileManager.default.createDirectory(at: url, withIntermediateDirectories: false, attributes: nil)
}
let subDirs = try documentsDirectory.subDirectories()
print("sub directories", subDirs)
subDirs.forEach { print([=11=].lastPathComponent) }
} catch {
print(error)
}