gpt4 book ai didi

c# - SharpZipLib : Compressing a single file to a single compressed file

转载 作者:太空狗 更新时间:2023-10-29 21:41:50 28 4
gpt4 key购买 nike

我目前在 .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 文件都包含在压缩存档中。这是因为传递给 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();
}
}
}

最佳答案

这是一个 XY 问题,只是不要使用 FastZip。按照 this web page 上的第一个示例进行操作以免发生意外。

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com