Swift动态获取项目目录下Library文件夹文件的方法问询
动态获取Swift项目目录下Library文件夹内容的解决方案
问题原因
- 你之前使用的
urls(for: .documentDirectory)获取的是App运行时沙盒内的Documents目录,和项目开发目录完全无关 Bundle.main.resourcePath指向的是App打包后的资源目录,项目里的Library文件夹如果未添加到target,不会出现在该路径下;就算添加了,也只是打包后的副本,并非你开发时修改的原目录
解决方案
方法1:利用Xcode环境变量(仅开发阶段可用)
Xcode在运行App时会自动设置PROJECT_DIR环境变量,直接指向项目根目录,通过它可以快速拼接Library路径:
guard let projectDir = ProcessInfo.processInfo.environment["PROJECT_DIR"] else { fatalError("无法获取项目目录(仅Xcode运行时有效)") } let libraryPath = "\(projectDir)/Library" do { let itemsInDirectory = try FileManager.default.contentsOfDirectory(atPath: libraryPath) print(itemsInDirectory) } catch { print("读取目录失败:\(error.localizedDescription)") }
方法2:通过可执行文件路径回溯(开发/打包后都可用)
如果需要打包后也能访问到项目目录下的Library(需提前确保Library文件夹与App包的相对位置固定),可以通过可执行文件的路径往上回溯找到项目根目录:
guard let executableURL = Bundle.main.executableURL else { fatalError("无法获取可执行文件路径") } // 根据你的项目结构调整回溯层级,示例假设App包直接放在项目根目录下 let projectRootURL = executableURL .deletingLastPathComponent() // 进入MacOS目录 .deletingLastPathComponent() // 进入Contents目录 .deletingLastPathComponent() // 退出App包目录 .deletingLastPathComponent() // 进入项目根目录 let libraryURL = projectRootURL.appendingPathComponent("Library") do { let itemsInDirectory = try FileManager.default.contentsOfDirectory(at: libraryURL, includingPropertiesForKeys: nil) print(itemsInDirectory) } catch { print("读取目录失败:\(error.localizedDescription)") }
额外说明
如果你的Library文件夹是作为App的内置资源使用,建议直接将其添加到Xcode target中,然后通过Bundle访问打包后的资源文件:
// 获取Library子目录下指定文件的URL if let fileURL = Bundle.main.url(forResource: "example", withExtension: "txt", subdirectory: "Library") { print(fileURL) }
这种方式会把Library内的文件打包进App,运行时访问的是打包后的副本,而非开发目录中的原文件。
内容的提问来源于stack exchange,提问作者Amir Abravesh
相关产品推荐
相关产品推荐

