Swift macOS本地文件URL百分号编码导致无法打开文件问题求助
macOS Swift 开发本地路径空格编码问题解决方案
问题根因
通过FileManager的contentsOfDirectory接口返回的是标准file://协议格式的URL对象,路径中的空格会自动转为百分号编码%20,无法打开文件的核心原因是URL转路径字符串时调用了错误的属性,或者混用了URL初始化方法。
解决方案
1. 优先直接使用URL对象操作文件
FileManager以及文件读写的系统API绝大多数都直接支持URL类型参数,不需要将其转为字符串处理,从根源避免编码问题:
let directoryURL = URL(fileURLWithPath: "/需要读取的目录路径/") do { let fileURLs = try FileManager.default.contentsOfDirectory(at: directoryURL, includingPropertiesForKeys: nil) for fileURL in fileURLs { // 直接使用返回的URL读取文件,不需要额外处理编码 if let fileContent = try? String(contentsOf: fileURL, encoding: .utf8) { print(fileContent) } } } catch { print("目录读取失败:\(error)") }
2. 需要路径字符串时调用path属性
如果业务需要拿到原生POSIX路径字符串,不要使用absoluteString属性,absoluteString返回的是带file://协议头和百分号编码的完整URL字符串,无法直接用于URL(fileURLWithPath:)初始化。
正确写法:
// 从FileManager拿到的文件URL let fileURL: URL = ... // 调用path属性获取原生未编码的路径 let rawPath = fileURL.path // 输出:/absolute Path/testfile.txt // 用原生路径初始化URL即可正常使用 let validURL = URL(fileURLWithPath: rawPath)
3. 已拿到编码后的URL字符串的处理方式
如果已经拿到了类似file:///absolute%20Path/testfile.txt的编码字符串,先通过URL(string:)转为URL对象再取路径即可:
let encodedUrlStr = "file:///absolute%20Path/testfile.txt" if let validURL = URL(string: encodedUrlStr) { let rawPath = validURL.path // 得到不带编码的原生路径 }
注意事项
不要混用两种URL初始化方法:
URL(fileURLWithPath:):专门处理本地文件路径,入参为原生带空格的POSIX路径字符串URL(string:):处理通用URL格式字符串,入参需要是带合法百分号编码的标准URL字符串
内容的提问来源于stack exchange,提问作者nonresidentalien
相关产品推荐
相关产品推荐

