SharpZipLib: сжатие одного файла в один сжатый файл

В настоящее время я работаю с 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.Сжатие не включает класс 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();
        }
    }
}
6
задан MrEyes 26 January 2011 в 17:34
поделиться