SharpZipLib : la Compression d'un fichier unique un unique fichier compressé

Je suis actuellement en train de travailler avec SharpZipLib sous .NET 2.0 et par cela j'ai besoin de compresser un fichier à une seule archive compressée. Pour ce faire, je suis actuellement en utilisant le suivant:

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);

Cela fonctionne exactement (ish) comme il se doit, cependant, alors que les tests que j'ai rencontré un mineur gotcha. Disons que mon répertoire temp (c'est à dire le répertoire qui contient le décompressé le fichier d'entrée) contient les fichiers suivants:

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

Quand je lance la compression de tous les .xml fichiers sont inclus dans l'archive compressée. La raison pour cela est dû à la finale fileFilter paramètre passé à la CreateZip méthode. Sous le capot SharpZipLib est d'effectuer une mise en correspondance du modèle et cela reprend aussi les fichiers avec le préfixe xxx_ et yyy_. Je suppose qu'il serait également ramasser quelque chose traitée ainsi.

La question est donc, comment puis-je compresser un fichier avec SharpZipLib? Puis à nouveau, peut-être la question est de savoir comment puis-je format fileFilter de sorte que le match ne peut jamais chercher le fichier que je veux compresser et rien d'autre.

En passant, est-il une raison pourquoi System.IO.Compression pas inclure un ZipStream classe? (Il ne supporte GZipStream)

EDIT : Solution (issues de accepté de répondre à de Hans Passant)

C'est la méthode de compression j'ai mis en place:

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();
        }
    }
}
  • De votre côté: ZipStream ne serait pas beaucoup de sens, puisque ZIP est un format d'archive qui peut contenir plus d'un fichier. Je suppose qu'ils pourraient avoir fourni une API complète pour la lecture et de l'écriture et de ZIPs, mais qui aurait évidemment été beaucoup plus d'efforts que GZipStream.
  • Comme une part de moi-même, que vous êtes seulement à la compression d'un fichier unique, est-il une raison pourquoi vous ne voulez pas de simplement utiliser la compression GZip, qui, comme vous l'avez remarqué, dispose d'un soutien dans le cadre?
  • J'aimerais, je pourrais le faire avec un couple de lignes de code. Il faut zip comme notre "soutien" bureau ne peut pas gérer la complexité de gzip (n'a que son sarcastique?? ;))
InformationsquelleAutor MrEyes | 2011-01-26