我目前在.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);

这完全可以(应该)正常工作,但是在测试时我遇到了一个小难题。可以说,我的临时目录(即包含未压缩输入文件的目录)包含以下文件:
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文件都包含在压缩文件中。这样做的原因是由于传递给fileFilter方法的最终CreateZip参数。 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();
        }
    }
}

最佳答案

这是一个XY问题,只是不要使用FastZip。请遵循this web page上的第一个示例来避免发生事故。

关于c# - SharpZipLib : Compressing a single file to a single compressed file,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4805043/

10-09 00:25