使用ICSharpCode.SharpZipLib.Zip添加目录条目报错‘Entry cannot have any data’
解决添加Zip目录条目时的“Entry cannot have any data”异常
问题原因
你遇到的异常是因为目录条目本身没有实际数据,但代码中给目录设置了需要处理数据的操作(比如Deflated压缩方式或AES加密),导致库无法处理空数据的压缩/加密逻辑。
解决方案
方案1:使用内置的AddDirectory方法(推荐)
DotNetZip库提供了直接添加目录的方法,会自动处理目录条目的所有正确属性,无需手动创建ZipEntry:
using (var zip = ZipFile.Create(zipPath)) { if (!string.IsNullOrEmpty(password)) { zip.ZipCryptoEncoding = Encoding.UTF8; zip.Password = password; } zip.UseZip64 = UseZip64.Dynamic; // 直接添加目标目录,自动生成正确的目录条目 zip.AddDirectory(dirPath); zip.Save(); }
方案2:手动创建目录条目时修正属性
如果必须手动构建ZipEntry,需要调整以下设置:
- 目录只能用
Stored压缩方式(默认就是该值,可省略),不能用Deflated(该方式需要压缩实际数据) - 不要给目录条目设置AES加密(无数据可加密)
修正后的代码:
using (var zip = ZipFile.Create(zipPath)) { if (!string.IsNullOrEmpty(password)) { zip.ZipCryptoEncoding = Encoding.UTF8; zip.Password = password; } zip.UseZip64 = UseZip64.Dynamic; var entryFactory = new ZipEntryFactory(); ZipEntry dirEntry = entryFactory.MakeDirectoryEntry(dirPath); dirEntry.DateTime = DateTime.Now; dirEntry.IsUnicodeText = true; // 目录条目只能用Stored压缩方式(默认已设置,此处可省略) dirEntry.CompressionMethod = CompressionMethod.Stored; zip.BeginUpdate(); zip.Add(dirEntry); zip.CommitUpdate(); }
关键说明
- 目录条目是用于标记路径的元数据,不包含实际文件内容,因此不需要压缩或加密操作。
AddDirectory方法会自动处理目录的路径格式、属性设置,避免手动构建条目时的错误。
内容的提问来源于stack exchange,提问作者TrustMe
相关产品推荐
相关产品推荐

