iOS Swift:如何仅获取Document目录中的文件夹而非文件?
没问题!你现在的代码是把Documents目录下所有内容都拉出来了,要只过滤文件夹的话,我们可以利用FileManager的属性判断功能,给你两种靠谱的实现方式:
方法一:一次性获取属性并过滤(推荐)
这种方法会在获取目录内容时直接请求isDirectory属性,避免多次I/O操作,性能更好,也是Apple推荐的路径处理方式:
guard let documentDirectoryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first else { print("无法获取Documents目录路径") return } do { // 将字符串路径转为URL,更安全可靠 let documentDirURL = URL(fileURLWithPath: documentDirectoryPath) // 请求每个项目的isDirectory属性,减少后续I/O操作 let directoryContents = try FileManager.default.contentsOfDirectory( at: documentDirURL, includingPropertiesForKeys: [.isDirectoryKey], options: [] ) // 过滤出仅文件夹的项目 let folderURLs = directoryContents.filter { url in var isDirectory: ObjCBool = false if FileManager.default.fileExists(atPath: url.path, isDirectory: &isDirectory) { return isDirectory.boolValue } return false } // 如果需要仅文件夹名称,转成字符串数组即可 let folderNames = folderURLs.map { $0.lastPathComponent } print(folderNames) // 输出目标文件夹列表 } catch { print("获取目录内容失败:\(error)") }
方法二:遍历路径逐一判断
如果你更习惯用字符串路径处理,也可以遍历每个项目,拼接完整路径后判断是否为目录:
guard let documentDirectoryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first else { print("无法获取Documents目录路径") return } do { let allItems = try FileManager.default.contentsOfDirectory(atPath: documentDirectoryPath) var folderNames: [String] = [] for item in allItems { // 拼接完整路径 let fullItemPath = documentDirectoryPath.appending("/\(item)") var isDirectory: ObjCBool = false // 判断当前项目是否为目录 if FileManager.default.fileExists(atPath: fullItemPath, isDirectory: &isDirectory) { if isDirectory.boolValue { folderNames.append(item) } } } print(folderNames) // 输出目标文件夹列表 } catch { print("获取目录内容失败:\(error)") }
额外小提示
- 尽量避免用
!强制解包documentDirectoryPath,用guard let处理边界情况更安全,防止路径获取失败导致崩溃 - 使用
URL处理文件路径能自动处理特殊字符、跨平台兼容等问题,比字符串拼接更可靠
内容的提问来源于stack exchange,提问作者Nikhil Viradiya
相关产品推荐
相关产品推荐

