VB.NET如何无需解压直接读取目录中最新版本的zip压缩包内容
实现方案
前置要求
首先在项目中添加System.IO.Compression.FileSystem程序集引用,该组件为.NET Framework 4.5及以上版本自带,无需引入第三方库。
原代码问题修正
你原有代码中使用GetDirectories查询zip文件是错误的:zip属于文件而非目录,需改为GetFiles查询;同时你需要先对所有Version *.zip文件按版本号排序取最大值,无需遍历所有压缩包。
调整后完整代码
' 引入必要命名空间 Imports System.IO Imports System.IO.Compression Sub ReadLatestZipContent() Dim path = "c:/MyZipFiles/" Dim id = 123456 Dim targetDirPath = Path.Combine(path, id.ToString()) ' 先判断数字命名的目录是否存在,原代码判断的是根目录存在,逻辑错误 If Directory.Exists(targetDirPath) Then Dim dirInfo = New DirectoryInfo(targetDirPath) ' 查询所有Version开头的zip文件 Dim zipFiles = dirInfo.GetFiles("Version *.zip", SearchOption.TopDirectoryOnly) If zipFiles.Any() Then ' 提取版本号排序,取版本最高的压缩包 ' 避免字符串排序问题,比如Version 10不会被排到Version 2前面 Dim latestZip = zipFiles.Select(Function(f) New With { .File = f, .Version = Integer.Parse(f.Name.Replace("Version ", "").Replace(".zip", "").Trim()) }).OrderByDescending(Function(x) x.Version).First().File ' Using语句必须加,自动释放文件流和压缩包资源,避免文件锁 Using archive As ZipArchive = ZipFile.OpenRead(latestZip.FullName) ' 替换为你需要读取的压缩包内的文件路径 Dim targetEntry = archive.GetEntry("你要读取的文件名,比如config.txt") If targetEntry IsNot Nothing Then ' 直接读流,完全不用解压到磁盘 Using sr As New StreamReader(targetEntry.Open()) Dim fileContent = sr.ReadToEnd() ' 这里处理你读取到的内容即可 Console.WriteLine(fileContent) End Using End If End Using End If End If End Sub
关键逻辑说明
- 版本号排序时将文件名中的数字提取为整数比较,规避了字符串排序中
Version 10排在Version 2前面的异常问题 ZipFile.OpenRead会直接以只读模式打开压缩包,无需解压落地- 所有实现了
IDisposable的对象(文件流、压缩包对象、读取流)都用Using包裹,执行结束后自动释放资源,不会产生文件锁
内容的提问来源于stack exchange,提问作者mydisplay
相关产品推荐
相关产品推荐

