0

SharpZipLibバージョン0.85.5を使用してファイルを解凍しています。私のコードは、気に入らないZIPファイルが見つかるまで、数か月間うまく機能しています。

ICSharpCode.SharpZipLib.Zip.ZipException: End of extra data     
    at ICSharpCode.SharpZipLib.Zip.ZipExtraData.ReadCheck(Int32 length) in C:\C#\SharpZLib\Zip\ZipExtraData.cs:line 933     
    at ICSharpCode.SharpZipLib.Zip.ZipExtraData.Skip(Int32 amount) in C:\C#\SharpZLib\Zip\ZipExtraData.cs:line 921     
    at ICSharpCode.SharpZipLib.Zip.ZipEntry.ProcessExtraData(Boolean localHeader) in C:\C#\SharpZLib\Zip\ZipEntry.cs:line 925     
    at ICSharpCode.SharpZipLib.Zip.ZipInputStream.GetNextEntry() in C:\C#\SharpZLib\Zip\ZipInputStream.cs:line 269     
    at Constellation.Utils.Tools.UnzipFile(String sourcePath, String targetDirectory) in C:\C#\Constellation2\Utils\Tools.cs:line 90     
--- End of inner exception stack trace ---

これが私の解凍方法です:

     public static void UnzipFile(string sourcePath, string targetDirectory)
     {
        try
        {
            using (ZipInputStream s = new ZipInputStream(File.OpenRead(sourcePath)))
            {
                ZipEntry theEntry;
                while ((theEntry = s.GetNextEntry()) != null)
                {
                    //string directoryName = Path.GetDirectoryName(theEntry.Name);
                    string fileName = Path.GetFileName(theEntry.Name);

                    if (targetDirectory.Length > 0)
                    {
                        Directory.CreateDirectory(targetDirectory);
                    }

                    if (fileName != String.Empty)
                    {
                        using (FileStream streamWriter = File.Create(targetDirectory + fileName))
                        {
                            int size = 2048;
                            byte[] data = new byte[2048];
                            while (true)
                            {
                                size = s.Read(data, 0, data.Length);
                                if (size > 0)
                                {
                                    streamWriter.Write(data, 0, size);
                                }
                                else
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            throw new Exception("Error unzipping file \"" + sourcePath + "\"", ex);
        }
    }

ファイルは、XPの組み込みZIPサポート、WinZIP、および7-Zipを使用して正常に解凍されます。例外がでスローされていs.GetNextEntry()ます。

4

4 に答える 4

1

他のzipツールが破損している余分なデータを無視している可能性があります。または、#ZipLibにバグがある可能性もあります。(私は少し前に見つけました-特定のオプションで圧縮してからきれいに解凍しない特定のファイル。)

この特定のケースでは、開発者の注意を引くために#ZipLibフォーラムに投稿することをお勧めします。ファイルに機密データが含まれておらず、短いが完全なプログラムを一緒に入手できる場合は、それが非常に役立つと思います。

于 2008-09-30T19:23:47.497 に答える
0

公式の ZIP 仕様を参照してください。

ZIP アーカイブ内の各ファイルには、関連する「追加」フィールドを含めることができます。#ZipLib は、指定された「余分な」フィールド長が、読み取り可能なデータ量よりも長かったことを示していると思います。つまり、ZIP ファイルが切り捨てられた可能性が高いということです。

于 2008-09-30T23:25:36.260 に答える
0

私はジョンに同意します。コメントに次のものが収まりませんでした:

(これはあなたの質問には答えませんが)次のようなものを使用する方が簡単ではありませんか:

public static void UnzipFile(string sourcePath, string targetDirectory)
{
    try
    {
        FastZip fastZip = new FastZip();
        fastZip.CreateEmptyDirectories = false;
        fastZip.ExtractZip(sourcePath, targetDirectory,"");
    }
    catch(Exception ex)
    {
        throw new Exception("Error unzipping file \"" + sourcePath + "\"", ex);
    }
}
于 2008-09-30T21:36:43.510 に答える