2016-03-29 7 views
0

Ich verwende seven.zip.sharp, um einen Stream zu komprimieren. Ich möchte dann nach der Komprimierung die Daten im Speicherstream in einen Filestream speichern. Die Datei ist eine ".7z" -Datei.Speichern des komprimierten Speicherstreams in Filestream, Enddatei ist beschädigt

Problem:
Die Ausgabedatei beschädigt ist, und ich bin nicht in der Lage es manuell zu dekomprimieren. Mit Notepad ++ kann ich auch nicht den Header sehen, der normalerweise in einer 7zip-Datei gefunden wird. Hier

ist der Code:

//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"); 
    } 

Bitte jemand die Frage ändern, um es besser aussehen zu lassen. Und fügen Sie einen besseren Titel hinzu, wenn Sie es wünschen. Vielen Dank.

+0

@Marko - (wie ich jemand Tag tun?) (http://stackoverflow.com/questions/4214663/sevenzipsharp-compress-memory-stream) – meme

+0

denke, Sie müssen die Speicher Streams Position zurücksetzen. Ist Ihre Ausgabe nicht 0 Bytes lang? –

+0

Ich glaube so. Ich erstelle den Stream "output", also sollte am Anfang 0 Bytes sein. – meme

Antwort

1

Sie planten also, den komprimierten Stream in einem temporären MemoryBuffer zu speichern und später in eine Datei zu schreiben. Das Problem ist, dass der MemoryStream nach dem Schreiben zurückgesetzt werden muss, so dass die Leseoperation von Anfang an gelesen wird. Wenn Ihre Ausgabedatei die Größe 0 hat, bin ich mir ziemlich sicher, dass dies das Problem ist.

ist hier ein fix:

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

Oder Sie den Stream erklären kann ein MemoryStream, und verwenden Sie die Position Eigenschaft zu sein:

TheStream.Position = 0; 
+0

Vielen Dank für die Hilfe. :) – meme

Verwandte Themen