SharpZipLib : 将单个文件压缩为单个压缩文件

Posted

技术标签:

【中文标题】SharpZipLib : 将单个文件压缩为单个压缩文件【英文标题】:SharpZipLib : Compressing a single file to a single compressed file 【发布时间】:2011-01-26 13:24:41 【问题描述】:

我目前正在使用 .NET 2.0 下的 SharpZipLib,通过它我需要将单个文件压缩为单个压缩存档。为了做到这一点,我目前正在使用以下内容:

string tempFilePath = @"C:\Users\Username\AppData\Local\Temp\tmp9AE0.tmp.xml";
string archiveFilePath = @"C:\Archive\Archive_[UTC TIMESTAMP].zip";

FileInfo inFileInfo = new FileInfo(tempFilePath);
ICSharpCode.SharpZipLib.Zip.FastZip fZip = new ICSharpCode.SharpZipLib.Zip.FastZip();
fZip.CreateZip(archiveFilePath, inFileInfo.Directory.FullName, false, inFileInfo.Name);

这完全可以(ish)正常工作,但是在测试时我遇到了一个小问题。假设我的临时目录(即包含未压缩输入文件的目录)包含以下文件:

tmp9AE0.tmp.xml //The input file I want to compress
xxx_tmp9AE0.tmp.xml // Some other file
yyy_tmp9AE0.tmp.xml // Some other file
wibble.dat // Some other file

当我运行压缩时,所有.xml 文件都包含在压缩存档中。其原因是因为传递给CreateZip 方法的最终fileFilter 参数。在后台 SharpZipLib 正在执行模式匹配,这也会获取前缀为 xxx_yyy_ 的文件。我认为它也可以拾取任何后缀的内容。

所以问题是,如何使用 SharpZipLib 压缩单个文件?再一次,也许问题是我如何格式化 fileFilter 以便匹配只能选择我想要压缩的文件,而不是别的。

顺便说一句,为什么System.IO.Compression 不包含ZipStream 类有什么原因吗? (只支持GZipStream)

编辑:解决方案(源自 Hans Passant 接受的答案)

这是我实现的压缩方式:

private static void CompressFile(string inputPath, string outputPath)

    FileInfo outFileInfo = new FileInfo(outputPath);
    FileInfo inFileInfo = new FileInfo(inputPath);

    // Create the output directory if it does not exist
    if (!Directory.Exists(outFileInfo.Directory.FullName))
    
        Directory.CreateDirectory(outFileInfo.Directory.FullName);
    

    // Compress
    using (FileStream fsOut = File.Create(outputPath))
    
        using (ICSharpCode.SharpZipLib.Zip.ZipOutputStream zipStream = new ICSharpCode.SharpZipLib.Zip.ZipOutputStream(fsOut))
        
            zipStream.SetLevel(3);

            ICSharpCode.SharpZipLib.Zip.ZipEntry newEntry = new ICSharpCode.SharpZipLib.Zip.ZipEntry(inFileInfo.Name);
            newEntry.DateTime = DateTime.UtcNow;
            zipStream.PutNextEntry(newEntry);

            byte[] buffer = new byte[4096];
            using (FileStream streamReader = File.OpenRead(inputPath))
            
                ICSharpCode.SharpZipLib.Core.StreamUtils.Copy(streamReader, zipStream, buffer);
            

            zipStream.CloseEntry();
            zipStream.IsStreamOwner = true;
            zipStream.Close();
        
    

【问题讨论】:

顺便说一句:ZipStream 没有多大意义,因为 ZIP 是一种可以保存多个文件的存档格式。我想他们本可以为读写和 ZIP 提供完整的 API,但这显然要比 GZipStream 付出更多的努力。 顺便说一句,由于您只压缩单个文件,您是否有理由不想只使用 GZip 压缩,正如您所指出的,它支持框架? 我很乐意,我可以用几行代码做到这一点。它必须是 zip,因为我们的“支持”办公桌无法处理 gzip 的复杂性(这听起来很讽刺吗??;)) 【参考方案1】:

这是一个 XY 问题,只是不要使用 FastZip。按照this web page上的第一个例子来避免意外。

【讨论】:

这行得通,但是压缩存档也包括所有目录。如果存档只包含根级别的文件而没有其他内容会更好。 字符串 entryName = System.IO.Path.GetFileName(filename);

以上是关于SharpZipLib : 将单个文件压缩为单个压缩文件的主要内容,如果未能解决你的问题,请参考以下文章

golang 如何在Go中使用bzip2将多个文件压缩为单个文件

C#使用ICSharpCode.SharpZipLib.dll压缩文件夹和文件

C#使用ICSharpCode.SharpZipLib.dll压缩文件夹和文件

快如闪电:Linux多线程压缩软件pigz和压缩神器zstd

C#工具类:使用SharpZipLib进行压缩解压文件

C#工具类:使用SharpZipLib进行压缩解压文件