【问题标题】:How to decompress .bz2 file in C#?如何在 C# 中解压缩 .bz2 文件?
【发布时间】:2012-10-08 13:43:18
【问题描述】:

我正在开发 wpf 应用程序。我正在使用sharpziplib 来压缩和解压缩文件。我很容易使用以下代码解压缩 .zip 文件

public static void UnZip(string SrcFile, string DstFile, string safeFileName, int bufferSize)
        {
            //ICSharpCode.SharpZipLib.Zip.UseZip64.Off;

            FileStream fileStreamIn = new FileStream(SrcFile, FileMode.Open, FileAccess.Read);
            ZipInputStream zipInStream = new ZipInputStream(fileStreamIn);


            string rootDirectory = string.Empty;
            if (safeFileName.Contains(".zip"))
            {
                rootDirectory = safeFileName.Replace(".zip", string.Empty);
            }
            else
            {
                rootDirectory = safeFileName;
            }

            Directory.CreateDirectory(App.ApplicationPath + rootDirectory);

            while (true)
            {
                ZipEntry entry = zipInStream.GetNextEntry();

                if (entry == null)
                    break;

                if (entry.Name.Contains("/"))
                {
                    string[] folders = entry.Name.Split('/');

                    string lastElement = folders[folders.Length - 1];
                    var folderList = new List<string>(folders);
                    folderList.RemoveAt(folders.Length - 1);
                    folders = folderList.ToArray();

                    string folderPath = "";
                    foreach (string str in folders)
                    {
                        folderPath = folderPath + "/" + str;
                        if (!Directory.Exists(App.ApplicationPath + rootDirectory + "/" + folderPath))
                        {
                            Directory.CreateDirectory(App.ApplicationPath + rootDirectory + "/" + folderPath);
                        }
                    }

                    if (!string.IsNullOrEmpty(lastElement))
                    {
                        folderPath = folderPath + "/" + lastElement;
                        WriteToFile(DstFile + rootDirectory + @"\" + folderPath, bufferSize, zipInStream, rootDirectory, entry);
                    }

                }
                else
                {
                    WriteToFile(DstFile + rootDirectory + @"\" + entry.Name, bufferSize, zipInStream, rootDirectory, entry);
                }
            }

            zipInStream.Close();           
            fileStreamIn.Close();
        }

        private static void WriteToFile(string DstFile, int bufferSize, ZipInputStream zipInStream, string rootDirectory, ZipEntry entry)
        {
            FileStream fileStreamOut = new FileStream(DstFile, FileMode.OpenOrCreate, FileAccess.Write);
            int size;
            byte[] buffer = new byte[bufferSize];

            do
            {
                size = zipInStream.Read(buffer, 0, buffer.Length);
                fileStreamOut.Write(buffer, 0, size);
            } while (size > 0);

            fileStreamOut.Close();
        }

但相同的代码不适用于 .bz2 文件。它在行出现错误

ZipEntry entry = zipInStream.GetNextEntry();

错误是 - 错误的本地标头签名:0x26594131。我应该如何解压缩 .bz2 文件?您能否提供我可以解决上述问题的任何代码或链接?

【问题讨论】:

    标签: c# unzip sharpziplib


    【解决方案1】:

    当您使用ZipInputStream 处理.zip 文件时,您应该使用BZip2InputStream 处理.bz2 文件(以及GZipInputStream 处理.gz 文件等)。

    【讨论】:

    【解决方案2】:

    与 Zip(以及 RAR 和 tar)不同,bz2 和 gzip 只是字节流压缩器。他们没有像上述那样的容器格式的概念,因此它在GetNextEntry 上失败了。 (也就是说,bz2 和 gzip 最多只有 1 个条目)。

    【讨论】:

    • ...因此扩展名为 .tar.bz2 和 .tar.gz... tarball 负责文件系统,流压缩器压缩这个单个 tarball 文件。 +1
    猜你喜欢
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多