Swift使用ZIPFoundation内存解压提取字符串失效问题
ZIPFoundation内存解压转String问题修复
Archive初始化返回nil排查点
- 传入的URL必须是本地文件URL:不能是远程网络链接,必须通过
fileURLWithPath生成指向沙盒本地zip文件的地址,远程文件需要先下载到本地再初始化。 - 提前校验文件状态:用
FileManager.default.fileExists(atPath: fileUrl.path)确认文件真实存在,且当前App有该路径的读取权限,文件不存在、权限不足时构造器会直接返回nil。 - 校验文件格式:传入的文件不是合法zip压缩包时,可失败构造器也会返回nil。
extract方法entry参数说明
entry代表压缩包内部的单个文件条目,不需要手动构造,从初始化成功的Archive实例中获取即可:可以遍历压缩包的所有条目,也可以通过文件名直接查找目标条目:
// 查找压缩包内名为"target.txt"的文件条目 guard let entry = archive["target.txt"] else { // 压缩包内不存在对应文件,提前返回 return }
内存解压转String完整实现
解压过程不需要将文件写入磁盘,直接在consumer回调中拼接分块返回的二进制数据,最后统一转成字符串即可:
func readZipContentToString(zipFileURL: URL, innerFileName: String) -> String? { // 校验本地文件存在 guard FileManager.default.fileExists(atPath: zipFileURL.path) else { return nil } // 初始化压缩包实例 guard let archive = Archive(url: zipFileURL, accessMode: .read, preferredEncoding: .utf8) else { return nil } // 查找目标文件条目 guard let entry = archive[innerFileName] else { return nil } var rawData = Data() do { try archive.extract(entry, consumer: { dataChunk in rawData.append(dataChunk) }) // 按UTF8编码转字符串,如果文件是其他编码替换对应枚举值即可 return String(data: rawData, encoding: .utf8) } catch { print("解压失败: \(error)") return nil } }
如果需要读取压缩包内所有文件的内容,直接遍历
archive的所有Entry对象,逐个执行上述解压拼接逻辑即可。
内容的提问来源于stack exchange,提问作者Kiran
相关产品推荐
相关产品推荐

