В настоящее время я работаю с SharpZipLib в .NET 2.0, и в связи с этим мне нужно сжать один файл в один сжатый архив.Чтобы сделать это, я в настоящее время использую следующее:
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)
РЕДАКТИРОВАТЬ: Решение (Получено из принятого ответа от Ханса Пассанта)
Это метод сжатия, который я реализовал:
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();
}
}
}