.NET Framework 4.7.2向现有Zip添加文件后文件不显示问题
解决向现有Zip文件添加内容后文件不显示的问题
问题根源
你的代码生成的pathInZip开头带有多余的斜杠(比如/03/Log_2024-03-01.log),而.NET的ZipArchive在Update模式下无法正确识别这种以斜杠开头的条目路径——文件确实被写入了Zip包,但路径格式不符合Zip规范,导致解压工具无法解析出正确的目录结构,自然看不到新增内容。
而ZipFile.CreateFromDirectory()能正常工作,是因为该方法会自动处理路径,生成符合规范的相对路径条目(比如03/Log_2024-03-01.log)。
修正方案
只需要调整pathInZip的生成逻辑,去掉开头的分隔符(反斜杠或正斜杠),确保路径是相对路径即可。同时不需要手动创建文件夹条目,CreateEntryFromFile会自动创建所需的目录结构。
修正后的代码片段:
using (var zip = ZipFile.Open(destinationZipFilePath, ZipArchiveMode.Update)) { var sourceDirInfo = new DirectoryInfo(sourceDirectoryPath); foreach (var file in sourceDirInfo.EnumerateFiles("*", SearchOption.AllDirectories)) { // 生成相对路径,去掉开头的分隔符 var relativePath = Path.GetRelativePath(sourceDirInfo.FullName, file.FullName); // 替换反斜杠为正斜杠,符合Zip规范 var pathInZip = relativePath.Replace("\\", "/"); // 移除已存在的条目 var existingEntry = zip.GetEntry(pathInZip); if (existingEntry != null) { existingEntry.Delete(); } // 添加文件,自动保留文件属性 zip.CreateEntryFromFile( file.FullName, pathInZip, compressionLevel); } }
关键细节说明
- 使用
Path.GetRelativePath()替代手动字符串替换,能更可靠地生成相对路径,避免因路径格式差异导致的开头分隔符问题; CreateEntryFromFile会自动根据pathInZip中的目录结构创建对应的Zip文件夹条目,无需手动创建;- 该方案完全保留了
CreateEntryFromFile的特性,能保留文件的创建/修改日期等属性,且无需解压重新生成Zip包。
内容的提问来源于stack exchange,提问作者CarenRose
相关产品推荐
相关产品推荐

