現在、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();
}
}
}
あなたのことを考えてみましょう:ZIPストリームは、複数のファイルを保持できるアーカイブフォーマットなので、あまり意味がありません。私は、彼らが読み書きとZIPのための完全なAPIを提供できたと思うが、それは明らかにGZipStreamよりはるかに多くの努力を払っていただろう。 –
私は自分自身のほかに、単一のファイルだけを圧縮しているので、フレームワーク内でサポートされているGZip圧縮を使用したくない理由がありますか? –
私は大好きです、私はコードのカップルの行でこれを行うことができます。私たちの 'サポート'デスクはgzipの複雑さに対応できないため、zipでなければなりません(それは悪いですか?)) – MrEyes