Xcode macOS Swift项目如何实现类似文件导入的整文件夹导入功能?
针对Swift macOS应用文件夹读取需求的解决方案
1. 弹窗选择指定文件夹读取内容
你可以直接修改.fileImporter的参数实现文件夹选择,无需其他组件:
- 将
allowedContentTypes设置为[.folder]即可让选择器只显示可选的文件夹 - 沙盒应用必须处理安全作用域权限才能访问选中的文件夹内容
示例代码:
.fileImporter( isPresented: $openFolder, allowedContentTypes: [.folder], allowsMultipleSelection: false ) { result in switch result { case .success(let urls): guard let folderURL = urls.first else { return } // 沙盒应用必须开启安全访问权限 guard folderURL.startAccessingSecurityScopedResource() else { print("无法获取文件夹访问权限") return } // 退出作用域时自动关闭访问权限 defer { folderURL.stopAccessingSecurityScopedResource() } // 读取文件夹内所有文件 do { let allFileURLs = try FileManager.default.contentsOfDirectory( at: folderURL, includingPropertiesForKeys: nil, options: [.skipsHiddenFiles, .skipsPackageDescendants] ) // 遍历处理所有文件 allFileURLs.forEach { fileURL in print("读取到文件:\(fileURL.lastPathComponent)") } } catch { print("读取文件夹内容失败:\(error.localizedDescription)") } case .failure(let error): print("选择文件夹失败:\(error.localizedDescription)") } }
如果需要长期访问选中的文件夹,你可以将该路径的安全作用域书签持久化存储到本地,下次应用启动时通过书签恢复访问权限,无需用户再次选择。
2. 已知文件夹路径时读取内容
该操作有前置限制:
- 未开启App Sandbox的应用可以直接通过路径读取任意有权限的文件夹内容
- 开启App Sandbox的应用必须已经获得该路径的访问权限(用户主动选择过/拖放过该文件夹到应用),否则哪怕路径正确也会返回权限错误
示例代码:
// 替换为你的目标文件夹绝对路径 let targetFolderURL = URL(fileURLWithPath: "/Users/用户名/目标文件夹路径") do { let fileList = try FileManager.default.contentsOfDirectory( at: targetFolderURL, includingPropertiesForKeys: nil, options: [] ) // 处理文件列表逻辑 } catch { print("读取失败:\(error.localizedDescription)") }
内容的提问来源于stack exchange,提问作者Saad Mahboob
相关产品推荐
相关产品推荐

