2017-07-15 26 views
0

を返します:アーカイブを作成した後、抽出プロセスが動作するため、実際にはすべてが、作品圧縮PDFファイル私はこのコードでDotNetZipを使用して2つのpdfファイルを圧縮しようとしている、破損したアーカイブ

void Main() 
{ 
    byte[] file1 = File.ReadAllBytes(@"C:\temp\a.pdf"); 
    byte[] file2 = File.ReadAllBytes(@"C:\temp\b.pdf"); 
    //byte[] file3 = File.ReadAllBytes(@"C:\temp\c.pdf"); 

    byte[] zip = Zipper.CreateZipFromFileContentList(new List<Tuple<string, byte[]>> { 
     new Tuple<string, byte[]>(@"a.pdf", file1), 
     new Tuple<string, byte[]>(@"b.pdf", file2)//, 
     //new Tuple<string, byte[]>(@"c.pdf", file3) 
    }); 
    File.WriteAllBytes(@"C:\temp\c.zip", zip); 

    using(Ionic.Zip.ZipFile zipFile = Ionic.Zip.ZipFile.Read(@"C:\temp\c.zip")) 
    { 
     foreach(ZipEntry entry in zipFile) 
     { 
      entry.Extract(@"C:\temp\t"); 
     } 
    } 
} 

// Define other methods and classes here 
static class Zipper 
{ 
    public static byte[] CreateZipFromFileContentList(IList<Tuple<string, byte[]>> fileContentList) 
    { 
     try 
     { 
      using (ZipFile zip = new ZipFile()) 
      { 
       int i = 0; 

       foreach (var item in fileContentList) 
       { 
        ZipEntry entry = null; 
        entry = zip.AddEntry(item.Item1, item.Item2); 
        ++i; 

       } 
       MemoryStream ms = new MemoryStream(); 
       zip.Save(ms); 
       return ms.GetBuffer(); 
      } 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 
} 

。しかし、私がwinRarを使ってzipファイルを開こうとすると、アーカイブが壊れているというメッセージが表示されます。私が7Zipで試してみると、便利なブロックの終わりを越えるデータがあるというメッセージが表示されます(翻訳されていれば、英語版がまったく同じメッセージを出しているかどうかわかりません)。

ファイルを1つまたは3つ圧縮すると、まったく問題はありません。 どうすれば修正できますか?

+0

これを通常のテキストファイルで試しましたか? 2つのテキストファイルを圧縮して解凍できますか? – rossum

+1

.GetBufferはストリームの内部バッファを返します。その一部には有効なデータが含まれているため、代わりに.ToArray()を使用するため、ジップ出力に余分なバイトが含まれている可能性があります。 –

+0

@AlexK。問題を修正したので、答えを出してください。それを正しいものとして受け入れます – Phate01

答えて

1

.GetBuffer()はストリームの内部バッファーを返します。その一部だけに有効なデータが含まれているため、ジップ出力に余分なバイトが含まれている可能性があります。

代わりに.ToArray()を使用すると、バッファの使用済み部分のみが返されます。

関連する問題