2011-01-26 164 views
6

現在、SharpZipLibを.NET 2.0で使用しています。これにより、1つのファイルを1つの圧縮アーカイブに圧縮する必要があります。これを行うために、私は現在、次の使用しています:これは正確に(っぽい)それが必要として動作しますSharpZipLib:1つのファイルを1つの圧縮ファイルに圧縮する

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で1つのファイルを圧縮するにはどうすればいいですか?それではもう一度疑問に思うかもしれませんが、どうすればそのファイルをfileFilterにフォーマットして、圧縮したいファイルだけを拾うことができるようになります。

なぜ、System.IO.Compressionには、ZipStreamクラスが含まれていない理由がありますか?

EDIT(それが唯一の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(); 
     } 
    } 
} 
+2

あなたのことを考えてみましょう:ZIPストリームは、複数のファイルを保持できるアーカイブフォーマットなので、あまり意味がありません。私は、彼らが読み書きとZIPのための完全なAPIを提供できたと思うが、それは明らかにGZipStreamよりはるかに多くの努力を払っていただろう。 –

+0

私は自分自身のほかに、単一のファイルだけを圧縮しているので、フレームワーク内でサポートされているGZip圧縮を使用したくない理由がありますか? –

+0

私は大好きです、私はコードのカップルの行でこれを行うことができます。私たちの 'サポート'デスクはgzipの複雑さに対応できないため、zipでなければなりません(それは悪いですか?)) – MrEyes

答えて

5

これは、XYの問題で、単に「ドンFastZipを使用します。事故を避けるために、this web pageの最初の例に従ってください。

+0

これはうまくいきますが、圧縮されたアーカイブにはすべてのディレクトリも含まれています。アーカイブにはルートレベルのファイルだけが含まれていて、他のものは含まれていない方がよいでしょう。 – MrEyes

+1

string entryName = System.IO.Path.GetFileName(filename); –

関連する問題