2016-03-29 5 views
0

私はseven.zip.sharpを使用してストリームを圧縮しています。私はその後、圧縮が完了した後、メモリストリームのデータをファイルストリームに保存します。ファイルは ".7z"ファイルです。圧縮されたメモリストリームをファイルストリームに保存すると、エンドファイルが壊れています

問題:
出力ファイルが破損していると私はそれを手動で解凍することができません。 notepad ++を使用する私はまた、通常7zipファイルに見られるヘッダを見ることができません。ここで

はコードです:

//Memory stream used to store compressed stream 
    public System.IO.Stream TheStream = new System.IO.MemoryStream(); 

    //Start compress stream 
    private void button1_Click(object sender, EventArgs e) 
    { 
     Thread newThread1 = new Thread(this.COMP_STREAM); 
     newThread1.Start(); 
    } 

    //See size of stream on demand 
    private void button2_Click(object sender, EventArgs e) 
    { 
      textBox1.Clear(); 
      textBox1.Text += "-" + TheStream.Length; 
    } 

    //To Create file 
    private void button3_Click(object sender, EventArgs e) 
    { 


     byte[] buffer = new byte[1024]; // Change this to whatever you need 

     using (System.IO.FileStream output = new FileStream(@"F:\Pasta desktop\sss\TESTEmiau.7z", FileMode.Create)) 
     { 
      int readBytes = 0; 
      while ((readBytes = TheStream.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       output.Write(buffer, 0, readBytes); 
      } 
      output.Close(); 
     } 
     MessageBox.Show("DONE"); 
    } 

    //To compress stream 
    public void COMP_STREAM() 
    { 
     SevenZip.SevenZipCompressor.SetLibraryPath(@"C:\Program Files\7-Zip\7z.dll"); 
     var stream = System.IO.File.OpenRead(@"F:\Pasta desktop\sss\lel.exe"); 

     SevenZip.SevenZipCompressor compressor = new SevenZip.SevenZipCompressor(); 
     compressor.CompressionMethod = SevenZip.CompressionMethod.Lzma2; 
     compressor.CompressionLevel = SevenZip.CompressionLevel.Ultra; 
     compressor.CompressStream(stream, TheStream); //I know i can just use a FileStream here but i am doing this from testing only. 
     MessageBox.Show("Done"); 
    } 

誰かがそれが良く見えるように質問を変更してください。もしあなたが望むなら、より良いタイトルを追加してください。ありがとうございました。

+0

@Marko(どのように私が誰かにタグを付けていますか?) - (http://stackoverflow.com/questions/4214663/sevenzipsharp-compress-memory-stream) – meme

+0

メモリストリームの位置をリセットする必要があると思います。あなたの出力は0バイトではありませんか? –

+0

私はそう信じます。ストリーム "出力"を作成するので、最初は0バイトにする必要があります。 – meme

答えて

1

圧縮されたストリームを一時的なMemoryBufferに格納し、後でファイルに書き出すことを計画しました。問題は、書き込み後にMemoryStreamをリセットする必要があるため、読み取り操作が最初から読み込まれることです。出力ファイルのサイズが0の場合は、これが問題であると確信しています。ここで

が修正です:

// Seek the beginning of the `MemoryStrem` before writing it to a file: 
TheStream.Seek(0, SeekOrigin.Begin); 

それとも、MemoryStreamするストリームを宣言し、Positionプロパティを使用することができます。

TheStream.Position = 0; 
+0

ありがとうございました。 :) – meme

関連する問題