Swift获取iOS应用子目录中所有资源URL的实现问题
解决iOS获取子目录「test」下所有资源URL的问题
首先得先排查一个很容易踩的坑——你的「test」文件夹是不是以文件夹引用(蓝色文件夹图标)的方式加入Xcode项目的?如果是黄色的「群组」文件夹,Xcode会把里面的文件直接平铺到主Bundle的根目录,不会保留test这个子目录结构,这肯定就找不到路径了。添加文件夹时一定要选择「Create folder references」选项,同时别忘了检查Target的「Build Phases」→「Copy Bundle Resources」里是否包含这个test文件夹,确保它会被打包进App。
接下来是具体的Swift实现代码,完全不需要硬编码文件名,自动获取所有文件的URL:
import Foundation func getAllFileURLsInTestFolder() -> [URL] { // 获取主Bundle的根URL guard let bundleRootURL = Bundle.main.resourceURL else { print("无法获取主Bundle的根路径") return [] } // 拼接test文件夹的URL let testFolderURL = bundleRootURL.appendingPathComponent("test") let fileManager = FileManager.default // 枚举test文件夹下的所有内容,跳过隐藏文件和包内容 guard let fileEnumerator = fileManager.enumerator(at: testFolderURL, includingPropertiesForKeys: [.isRegularFileKey], options: [.skipsHiddenFiles, .skipsPackageDescendants]) else { print("无法枚举test文件夹内的内容") return [] } var fileURLs: [URL] = [] for case let itemURL as URL in fileEnumerator { // 只筛选普通文件,排除子目录本身 do { let resourceProps = try itemURL.resourceValues(forKeys: [.isRegularFileKey]) if resourceProps.isRegularFile == true { fileURLs.append(itemURL) } } catch { print("获取文件属性失败:\(error.localizedDescription)") } } return fileURLs } // 调用示例 let testFiles = getAllFileURLsInTestFolder() print("test文件夹下的所有文件URL:\(testFiles)")
代码细节说明:
- 用
Bundle.main.resourceURL替代传统的path方法,这是苹果推荐的现代File API用法,更适配URL体系。 enumerator(at:...)比contentsOfDirectory(at:...)更灵活:支持递归遍历子目录(如果需要的话),还能跳过隐藏文件这类不需要的内容。如果只需要test文件夹下的直接文件(不包含子目录),可以把options改成[.skipsHiddenFiles, .skipsSubdirectoryDescendants]。- 通过
resourceValues(forKeys:)判断是否为普通文件,避免把目录本身也加入结果数组。
如果还是找不到路径,你可以先打印testFolderURL,然后通过Xcode的「Products」里的App右键「Show in Finder」,再右键显示包内容,看看test文件夹是否真的在Bundle里,以及里面的文件是否存在——这一步能帮你快速定位是代码问题还是打包配置问题。
内容的提问来源于stack exchange,提问作者Dom Bryan
相关产品推荐
相关产品推荐

