4

コードに次のメソッドがあります。

private bool GenerateZipFile(List<FileInfo> filesToArchive, DateTime archiveDate)
{
    try
    {
        using (ZipOutputStream zipStream = new ZipOutputStream(File.Create(GetZipFileName(archiveDate))))
        {
            zipStream.SetLevel(9); // maximum compression.
            byte[] buffer = new byte[4096];

            foreach (FileInfo fi in filesToArchive)
            {
                string fileName = ZipEntry.CleanName(fi.Name);
                ZipEntry entry = new ZipEntry(fileName);
                entry.DateTime = fi.LastWriteTime;
                zipStream.PutNextEntry(entry);

                using (FileStream fs = File.OpenRead(fi.FullName))
                {
                    StreamUtils.Copy(fs, zipStream, buffer);
                }

                zipStream.CloseEntry();
            }

            zipStream.Finish();
            zipStream.Close();
        }
        return true; 
    }
    catch (Exception ex)
    {
        OutputMessage(ex.ToString());
        return false;
    }
}

このコードは、すべて正しいエントリを含む ZIP ファイルを生成しますが、各ファイルは 4 TB (アンパックとパックの両方) としてリストされ、開こうとすると次のエラーが発生します。

Extracting to "C:\winnt\profiles\jbladt\LOCALS~1\Temp\"
Use Path: no   Overlay Files: yes
skipping: QPS_Inbound-20081113.txt: this file is not in the standard Zip 2.0 format
   Please see www.winzip.com/zip20.htm for more information
error:  no files were found - nothing to do

コードは実際にはサンプルから取られていますが、何かが欠けているようです。誰にも指針がありますか?

4

4 に答える 4

7

DotNetZipに切り替えるまでは、SharpZipLib を使用していました。代替手段として確認してみてください。

例:

try
   {
     using (ZipFile zip = new ZipFile("MyZipFile.zip")
     {
       zip.AddFile("c:\\photos\\personal\\7440-N49th.png");
       zip.AddFile("c:\\Desktop\\2005_Annual_Report.pdf");
       zip.AddFile("ReadMe.txt");
       zip.Save();
     }
   }
   catch (System.Exception ex1)
   {
     System.Console.Error.WriteLine("exception: " + ex1);
   }
于 2008-11-25T19:41:06.033 に答える
3

Tyler Holmesの投稿を参照してください。

Winzip 8.0 などの問題は Zip64 にあります。ZipEntry を追加するときに元のファイル サイズを設定すると、エラーはなくなります。

例えば

string fileName = ZipEntry.CleanName(fi.Name);
ZipEntry entry = new ZipEntry(fileName);
entry.DateTime = fi.LastWriteTime;
entry.Size = fi.Length;
zipStream.PutNextEntry(entry);

現在のリリースの zip ユーティリティには問題はありません。

于 2008-12-13T04:43:55.547 に答える
2

オブジェクトにCompressionMethodCompressedSizeプロパティを指定することで解決した同様の問題がありました。ZipEntryただし、私の使用法では、実際にファイルを圧縮するのではなく、1 回のダウンロードでいくつかの非常に小さなファイルをグループ化するために zip が作成されていたため、圧縮を使用せず (レベル 0)、CompressedSizeプロパティにファイルの実際のサイズを使用することで回避しました。圧縮が必要な場合、それがどのように機能するかわかりません。

于 2008-11-25T18:37:14.103 に答える
0

将来同じ問題を抱えている人のために: 私の問題は、本当に古いバージョンの WinZip (8.0 だと思います) を使用してファイルを表示していたことが判明しました。最新のビューア(12.0)を使用すると、問題が解決しました。

于 2008-12-03T22:38:48.063 に答える