0

asp.netでc#を使用してSharePointファイルを圧縮するためにicsharpziplib dllを使用して
います。output.zipファイルを開くと、「zipファイルが破損しているか破損しています」と表示されます。また、output.zip内のファイルのcrc値は000000と表示されています。

  1. icsharpziplib dllを使用してcrc値を計算または構成するにはどうすればよいですか?
  2. メモリストリームを使用して圧縮を行う方法の良い例を誰かが持つことができますか?
4

2 に答える 2

2

各 ZipEntry を作成していないようです。

これが私のニーズに合わせたコードです: http://wiki.sharpdevelop.net/SharpZipLib-Zip-Samples.ashx#Create_a_Zip_fromto_a_memory_stream_or_byte_array_1

とにかく、SharpZipLib を使用すると、zip ファイルを操作できる多くの方法があります:ZipFileクラス、ZipOutputStreamおよびFastZip.

ZipOutputStream を使用してインメモリ ZIP ファイルを作成し、それにインメモリ ストリームを追加し、最後にディスクにフラッシュしましたが、非常にうまく機能しています。ZipOutputStream を使用する理由 圧縮レベルを指定してStreams.

幸運を :)

于 2011-07-13T07:56:55.127 に答える
0

1:手動で行うこともできますが、ICSharpCode ライブラリが処理します。また、私が発見したこと: 「zip ファイルが破損しているか破損しています」は、zip エントリ名を正しく追加していない (サブフォルダのチェーンにあるエントリなど) ことの結果である可能性もあります。

2: この問題は、compressionHelper ユーティリティを作成することで解決しました。zip ファイルを動的に作成して返す必要がありました。プロセスは Web サービスによって実行されるため、一時ファイルはオプションではありませんでした。これの秘訣は、BeginZip()、AddEntry()、および EndZip() メソッドでした (呼び出すユーティリティにしたためです。必要に応じてコードを直接使用することもできます)。

この例から除外したのは、初期化のチェック (誤って最初に EndZip() を呼び出すなど) と適切な破棄コード (IDisposable を実装し、該当する場合は zipfileStream と memoryStream を閉じるのが最適です) です。

using System.IO;
using ICSharpCode.SharpZipLib.Zip;

public void BeginZipUpdate()
    {
        _memoryStream = new MemoryStream(200);
        _zipOutputStream = new ZipOutputStream(_memoryStream);
    }

public void EndZipUpdate()
    {
        _zipOutputStream.Finish();
        _zipOutputStream.Close();
        _zipOutputStream = null;
    }

//Entry name could be 'somefile.txt' or 'Assemblies\MyAssembly.dll' to indicate a folder.
//Unsure where you'd be getting your file, I'm reading the data from the database.
public void AddEntry(string entryName, byte[] bytes)
    {
        ZipEntry entry = new ZipEntry(entryName);
        entry.DateTime = DateTime.Now;            
        entry.Size = bytes.Length;            
        _zipOutputStream.PutNextEntry(entry);
        _zipOutputStream.Write(bytes, 0, bytes.Length);
        _zipOutputStreamEntries.Add(entryName);
    }

したがって、実際にはzipOutputStreamをmemoryStreamに書き込んでいます。次に、_zipOutputStream が閉じられると、memoryStream の内容を返すことができます。

public byte[] GetResultingZipFile()
    {           
        _zipOutputStream.Finish();
        _zipOutputStream.Close();
        _zipOutputStream = null;
        return _memoryStream.ToArray();
    }

zipfile にどれだけ追加したいかだけ注意してください (プロセスの遅延/IO/タイムアウトなど)。

于 2011-08-15T15:31:48.790 に答える