You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:30:43