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

見栄えを良くするために誰かが質問を変更してください。必要に応じて、より良いタイトルを追加してください。ありがとうございました。

4

1 に答える 1

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;
于 2016-03-29T15:24:11.250 に答える