5

私は SharpZipLib を使用してファイルを解凍しています。私のコードは、現在抽出しているzipファイルを除くすべてのzipファイルでうまく機能しています...

この例外があります:

System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: length

例外がスローされています size = s.Read(data, 0, data.Length);

Herebは私のコードです...

 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);
        }
    }
4

3 に答える 3

5

私にはバグのように見えます。幸いなことに、コードにアクセスできるので、どこで問題が発生しているかを正確に確認できるはずです。SharpZipLib のデバッグ バージョンをビルドし、例外をスローしている行で中断し、実際にテストしているものを確認することをお勧めします。

2K のデータが残っていなくても、2K のバッファに読み込むことは問題ありません。

(私は実際にあなたが持っている方法でコードを書くつもりはありませんが、それは別の問題です.私はそれを独自のユーティリティメソッドに移動します.1つのストリームから別のストリームにすべてのデータをコピーする行為はかなり一般的です.ジッパーで結ぶ必要があります。)

于 2010-12-14T07:10:25.347 に答える
-1

コードを見ると、同じバイトセットを再度読み取っています (そして位置を進めています)。

size = s.Read(data, 0, data.Length);

hereの例は、2 番目の引数が固定数ではなく移動位置であることを示しています。

于 2010-12-14T07:06:18.743 に答える
-1

コード int size = 2048; を に変更しますint size = data.Length;。OutOfRange 例外は発生しません。

 using (FileStream streamWriter = File.Create(targetDirectory + fileName))
    {
       int size = data.Length;
       byte[] data = new byte[size];
       while (true)
       {
            size = s.Read(data, 0, data.Length);
            if (size > 0)
            {
                streamWriter.Write(data, 0, size);
            }
            else
            {
               break;
            }
       }
    }
于 2010-12-14T07:15:53.990 に答える