如何在IIS 6环境运行的ASP.NET 2.0中压缩目录(文件夹)?
在ASP.NET 2.0(IIS6)下压缩目录为标准ZIP文件
你提供的代码用GZipStream实现的不是标准ZIP格式——GZipStream仅用于单个数据流的压缩,生成的是.gz格式文件,而非包含多文件结构的ZIP。你的代码只是把多个文件的自定义元数据(文件名长度、文件名、文件内容长度、内容)打包压缩,这种自定义格式无法被常规解压工具识别,所以会出现"格式错误、未知文件"的问题。
因为.NET 2.0没有内置的ZIP归档类(ZipArchive是.NET 4.5才引入的),最可靠的方案是使用兼容.NET 2.0的第三方压缩库,或者手动实现ZIP格式核心规范(后者复杂度高,不推荐)。
方案1:使用SharpZipLib实现目录压缩
- 准备依赖:下载兼容.NET 2.0的SharpZipLib版本(如0.86.0),将
ICSharpCode.SharpZipLib.dll添加到项目引用中。 - 编写压缩代码:
using System.IO; using ICSharpCode.SharpZipLib.Zip; public void CompressDirectoryToZip(string sourceDir, string outputZipPath) { using (FileStream zipFileStream = File.Create(outputZipPath)) using (ZipOutputStream zipStream = new ZipOutputStream(zipFileStream)) { // 设置压缩级别(0-9,数值越高压缩率越高) zipStream.SetLevel(5); string[] allFiles = Directory.GetFiles(sourceDir, "*.*", SearchOption.AllDirectories); int baseDirLength = sourceDir.EndsWith(Path.DirectorySeparatorChar.ToString()) ? sourceDir.Length : sourceDir.Length + 1; foreach (string filePath in allFiles) { // 计算文件在ZIP中的相对路径,统一使用ZIP标准的斜杠分隔符 string relativePath = filePath.Substring(baseDirLength) .Replace(Path.DirectorySeparatorChar, '/'); ZipEntry entry = new ZipEntry(relativePath); entry.DateTime = File.GetLastWriteTime(filePath); zipStream.PutNextEntry(entry); // 分块写入文件内容,避免内存占用过高 using (FileStream fileStream = File.OpenRead(filePath)) { byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) > 0) { zipStream.Write(buffer, 0, bytesRead); } } zipStream.CloseEntry(); } } }
- 权限配置:确保IIS6应用池的运行身份(默认是Network Service)对源目录有读取权限,对ZIP输出目录有写入权限。
方案2:手动实现ZIP格式(不推荐)
如果无法引入第三方库,需要严格遵循PKZIP标准手动实现ZIP结构,包括:
- 每个文件的本地文件头(存储文件名、压缩方式、大小等元数据)
- 文件的压缩/未压缩内容
- 中央目录记录(汇总所有文件的元数据)
- 中央目录结束记录(标记ZIP文件结尾)
这种方式极易出现格式错误,仅在极端受限场景下考虑。
内容的提问来源于stack exchange,提问作者user20485078
相关产品推荐
相关产品推荐

