ZipArchive 支持流式读取 ZIP 内指定文件而不解压到磁盘:需用 ZipArchiveMode.Read 打开,GetEntry 获取条目后调用 Open() 得到流;注意 FileShare.Read、路径大小写与斜杠、null 判空及复用实例提升性能。
用 ZipArchive 打开 ZIP 并直接读取指定文件流
不需要解压到磁盘,ZipArchive(来自 System.IO.Compression)支持只读打开 ZIP,并按路径名定位内部文件。关键在于用 ZipArchiveMode.Read 打开,再通过 GetEntry(string) 获取目标项,最后调用 Open() 得到可读流。
常见错误是误用 ExtractToFile 或尝试把整个 ZIP 加载进内存再解析——既慢又占资源。正确做法是流式访问:
-
ZipArchive必须用using管理,否则底层FileStream可能被锁住 - 路径名必须和 ZIP 内实际路径完全一致(区分大小写,且用正斜杠
/,即使 Windows 打包也建议统一用/) - 如果文件不存在,
GetEntry返回null,不抛异常,需手动判空
using (var archive = new ZipArchive(fileStream, ZipArchiveMode.Read))
{
var entry = archive.GetEntry("data/config.json");
if (entry != null)
{
using (var stream = entry.Open())
using (var reader = new StreamReader(stream))
{
string content = reader.ReadToEnd();
}
}
}
从文件路径构造 FileStream 时注意 FileShare.Read
直接传 new FileStream(path, FileMode.Open) 很容易在多线程或重复读取时触发“文件正由另一进程使用”错误。ZIP 包本质是随机访问的二进制文件,多个 ZipArchive 实例可能同时读同一文件。
解决方案是显式指定共享模式: