使用7z SDK解压缩多个文件

问题描述 投票:0回答:1

我正在尝试实现7z SDK一次压缩和解压缩多个文件。

我一次尝试使用一个文件,两种方法都有效,现在我对compress方法实现了一些更改,以支持多个压缩文件。

public static void CompressFile(List<string> inFiles, string outFile)
{
        SevenZip.Compression.LZMA.Encoder coder = new SevenZip.Compression.LZMA.Encoder();

        FileStream output = new FileStream(outFile, FileMode.Create);

        // Write the encoder properties
        coder.WriteCoderProperties(output);

        int listSize = inFiles.Count;

        // get the size of my list to loop through all the items
        // Writing each file on the compressed file at a time

        for(int i = 0; i < listSize; i++)
        {
            FileStream input = new FileStream(inFiles[i], FileMode.Open);

            // Write the decompressed file size.
            output.Write(BitConverter.GetBytes(input.Length), 0, 8);

            // Encode the file.
            coder.Code(input, output, input.Length, -1, null);
        }
        output.Flush();
        output.Close();
    }

我按预期得到了一个压缩文件但我需要实现解压缩方法来测试一切是否顺利。

我不知道如何实现解压缩多个文件所需的更改:

public static void DecompressFile(string inFile, string outFile)
{
        //Original method used to decompress one file worked.

        SevenZip.Compression.LZMA.Decoder coder = new SevenZip.Compression.LZMA.Decoder();


            FileStream input = new FileStream(inFile, FileMode.Open);
            FileStream output = new FileStream(outFile, FileMode.Create);

            // Read the decoder properties
            byte[] properties = new byte[5];
            input.Read(properties, 0, 5);

            // Read in the decompress file size.
            byte[] fileLengthBytes = new byte[8];
            input.Read(fileLengthBytes, 0, 8);
            long fileLength = BitConverter.ToInt64(fileLengthBytes, 0);

            coder.SetDecoderProperties(properties);
            coder.Code(input, output, input.Length, fileLength, null);
            output.Flush();
            output.Close();

    }

我有想法(不知道好不好)使用循环结构压缩所有文件,但解压缩它我不能。哪种方法是理想的解压缩应该包含多个文件的文件?

c# console-application 7zip
1个回答
1
投票

我用gzipstream做了类似的事情。但它完全取决于你如何打包文件。

在这种情况下,这样的事情将是理想的。

string payload = Path.GetTempFileName();
using (FileStream temp_fs = new FileStream(payload, FileMode.OpenOrCreate))
{
    using (BinaryWriter output_s = new BinaryWriter(new FileStream("target.out", FileMode.OpenOrCreate)))
    {
        //Write a blank. must be a long!
        output_s.Write((long)0);
        foreach (string file in Files)
        {

            //Write the files name
            output_s.Write(file);
            long start = temp_fs.Position;

            //Write the starting point
            output_s.Write(start);

            //Compress the file to the payload
            using (GZipStream gzip = new GZipStream(temp_fs, CompressionMode.Compress, true))
            {
                using (FileStream fs = new FileStream(file, FileMode.Open))
                {
                    fs.CopyTo(gzip);
                }
            }

            //Write the length
            output_s.Write(temp_fs.Position - start);
        }

        //When all files are written
        //Get the size of our header
        long headersize = output_s.BaseStream.Length - 8;

        //Copy the temp file data to the end
        temp_fs.CopyTo(output_s.BaseStream);

        //Reset to the start of the stream
        output_s.BaseStream.Position = 0;

        //override our zero
        output_s.Write(headersize);
    }

}
File.Delete(payload);

当你读取你的文件将二进制读取你将能够按名称获取文件,然后在文件名将是它的大小并开始之后的下一个。然后你将节头+ pos解压缩到长度。检索你的文件。

© www.soinside.com 2019 - 2024. All rights reserved.