C# 在 .net 中以编程方式解压缩文件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/836736/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-05 03:34:19  来源:igfitidea点击:

Unzip files programmatically in .net

c#unzip

提问by Petteri

I am trying to programatically unzip a zipped file.

我正在尝试以编程方式解压缩压缩文件。

I have tried using the System.IO.Compression.GZipStreamclass in .NET, but when my app runs (actually a unit test) I get this exception:

我曾尝试System.IO.Compression.GZipStream在 .NET 中使用该类,但是当我的应用程序运行时(实际上是一个单元测试),我收到此异常:

System.IO.InvalidDataException: The magic number in GZip header is not correct. Make sure you are passing in a GZip stream..

System.IO.InvalidDataException:GZip 标头中的幻数不正确。确保您传递的是 GZip 流。

I now realize that a .zipfile is not the same as a .gzfile, and that GZipis not the same as Zip.

我现在意识到.zip文件与.gz文件不同,这GZipZip.

However, since I'm able to extract the file by manually double clicking the zipped file and then clicking the "Extract all files"-button, I think there should be a way of doing that in code as well.

但是,由于我可以通过手动双击压缩文件然后单击“提取所有文件”按钮来提取文件,因此我认为也应该有一种在代码中执行此操作的方法。

Therefore I've tried to use Process.Start()with the path to the zipped file as input. This causes my app to open a Window showing the contents in the zipped file. That's all fine, but the app will be installed on a server with none around to click the "Extract all files"-button.

因此,我尝试使用Process.Start()压缩文件的路径作为输入。这会导致我的应用程序打开一个窗口,显示压缩文件中的内容。一切都很好,但是该应用程序将安装在服务器上,而周围没有单击“提取所有文件”按钮。

So, how do I get my app to extract the files in the zipped files?

那么,如何让我的应用程序提取压缩文件中的文件?

Or is there another way to do it? I prefer doing it in code, without downloading any third party libraries or apps; the security department ain't too fancy about that...

或者有其他方法可以做到吗?我更喜欢用代码来做,而不用下载任何第三方库或应用程序;安全部门对此不太看好......

采纳答案by Chris Conway

We have used SharpZipLibsuccessfully on many projects. I know it's a third party tool, but source code is included and could provide some insight if you chose to reinvent the wheel here.

我们已经在许多项目中成功地使用了SharpZipLib。我知道它是第三方工具,但包含源代码,如果您选择在这里重新发明轮子,可以提供一些见解。

回答by Sam Axe

Use the DotNetZip library at http://www.codeplex.com/DotNetZip

使用http://www.codeplex.com/DotNetZip 上的 DotNetZip 库

class library and toolset for manipulating zip files. Use VB, C# or any .NET language to easily create, extract, or update zip files...

DotNetZip works on PCs with the full .NET Framework, and also runs on mobile devices that use the .NET Compact Framework. Create and read zip files in VB, C#, or any .NET language, or any scripting environment...

If all you want is a better DeflateStream or GZipStream class to replace the one that is built-into the .NET BCL, DotNetZip has that, too. DotNetZip's DeflateStream and GZipStream are available in a standalone assembly, based on a .NET port of Zlib. These streams support compression levels and deliver much better performance than the built-in classes. There is also a ZlibStream to complete the set (RFC 1950, 1951, 1952)...

用于操作 zip 文件的类库和工具集。使用 VB、C# 或任何 .NET 语言轻松创建、提取或更新 zip 文件...

DotNetZip 可在具有完整 .NET Framework 的 PC 上运行,也可在使用 .NET Compact Framework 的移动设备上运行。在 VB、C# 或任何 .NET 语言或任何脚本环境中创建和读取 zip 文件...

如果您想要的只是一个更好的 DeflateStream 或 GZipStream 类来替换内置于 .NET BCL 中的类,DotNetZip 也有。DotNetZip 的 DeflateStream 和 GZipStream 以独立程序集形式提供,基于 Zlib 的 .NET 端口。这些流支持压缩级别并提供比内置类更好的性能。还有一个 ZlibStream 来完成该集(RFC 1950, 1951, 1952)...

回答by Kenneth Cochran

Standard zip files normally use the deflate algorithm.

标准 zip 文件通常使用 deflate 算法。

To extract files without using third party libraries use DeflateStream. You'll need a bit more information about the zip file archive format as Microsoft only provides the compression algorithm.

要在不使用第三方库的情况下提取文件,请使用 DeflateStream。您需要更多关于 zip 文件存档格式的信息,因为 Microsoft 仅提供压缩算法。

You may also try using zipfldr.dll. It is Microsoft's compression library (compressed folders from the Send to menu). It appears to be a com library but it's undocumented. You may be able to get it working for you through experimentation.

您也可以尝试使用 zipfldr.dll。它是 Microsoft 的压缩库(来自“发送到”菜单的压缩文件夹)。它似乎是一个 com 库,但它没有记录。您可以通过实验让它为您工作。

回答by RedWolves

From here:

这里

Compressed GZipStream objects written to a file with an extension of .gz can be decompressed using many common compression tools; however, this class does not inherently provide functionality for adding files to or extracting files from .zip archives.

写入扩展名为 .gz 的文件的压缩 GZipStream 对象可以使用许多常见的压缩工具进行解压缩;但是,此类本身并不提供将文件添加到 .zip 存档或从 .​​zip 存档中提取文件的功能。

回答by Lukas

Free, and no external DLL files. Everything is in one CS file. One download is just the CS file, another download is a very easy to understand example. Just tried it today and I can't believe how simple the setup was. It worked on first try, no errors, no nothing.

免费,没有外部 DLL 文件。一切都在一个 CS 文件中。一个下载只是 CS 文件,另一个下载是一个非常容易理解的例子。今天刚试过,我简直不敢相信设置是多么简单。它在第一次尝试时有效,没有错误,什么也没有。

https://github.com/jaime-olivares/zipstorer

https://github.com/jaime-olivares/zipstorer

回答by bsara

With .NET 4.5you can now unzip files using the .NET framework:

使用.NET 4.5,您现在可以使用 .NET 框架解压缩文件:

using System;
using System.IO;

namespace ConsoleApplication
{
  class Program
  {
    static void Main(string[] args)
    {
      string startPath = @"c:\example\start";
      string zipPath = @"c:\example\result.zip";
      string extractPath = @"c:\example\extract";

      System.IO.Compression.ZipFile.CreateFromDirectory(startPath, zipPath);
      System.IO.Compression.ZipFile.ExtractToDirectory(zipPath, extractPath);
    }
  }
}

The above code was taken directly from Microsoft's documentation: http://msdn.microsoft.com/en-us/library/ms404280(v=vs.110).aspx

上面的代码直接取自微软的文档:http: //msdn.microsoft.com/en-us/library/ms404280(v=vs.110).aspx

ZipFileis contained in the assembly System.IO.Compression.FileSystem. (Thanks nateirvin...see comment below)

ZipFile包含在程序集中System.IO.Compression.FileSystem。(感谢 nateirvin ......见下面的评论)

回答by Phyllip Hamby

I use this to either zip or unzip multiple files. The Regex stuff is not required, but I use it to change the date stamp and remove unwanted underscores. I use the empty string in the Compress >> zipPath string to prefix something to all files if required. Also, I usually comment out either Compress() or Decompress() based on what I am doing.

我用它来压缩或解压缩多个文件。Regex 的东西不是必需的,但我用它来更改日期戳并删除不需要的下划线。如果需要,我使用 Compress >> zipPath 字符串中的空字符串为所有文件添加前缀。另外,我通常会根据我正在做的事情注释掉 Compress() 或 Decompress() 。

using System;
using System.IO.Compression;
using System.IO;
using System.Text.RegularExpressions;

namespace ZipAndUnzip
{
    class Program
    {
        static void Main(string[] args)
        {
            var directoryPath = new DirectoryInfo(@"C:\your_path\");

            Compress(directoryPath);
            Decompress(directoryPath);
        }

        public static void Compress(DirectoryInfo directoryPath)
        {
            foreach (DirectoryInfo directory in directoryPath.GetDirectories())
            {
                var path = directoryPath.FullName;
                var newArchiveName = Regex.Replace(directory.Name, "[0-9]{8}", "20130913");
                newArchiveName = Regex.Replace(newArchiveName, "[_]+", "_");
                string startPath = path + directory.Name;
                string zipPath = path + "" + newArchiveName + ".zip";

                ZipFile.CreateFromDirectory(startPath, zipPath);
            }

        }

        public static void Decompress(DirectoryInfo directoryPath)
        {
            foreach (FileInfo file in directoryPath.GetFiles())
            {
                var path = directoryPath.FullName;
                string zipPath = path + file.Name;
                string extractPath = Regex.Replace(path + file.Name, ".zip", "");

                ZipFile.ExtractToDirectory(zipPath, extractPath);
            }
        }


    }
}

回答by Per Lundberg

I found out about this one(Unzip package on NuGet) today, since I ran into a hard bug in DotNetZip, and I realized there hasn't been really that much work done on DotNetZip for the last two years.

我今天发现了这个(NuGet 上的解压缩包),因为我在 DotNetZip 中遇到了一个严重的错误,我意识到过去两年在 DotNetZip 上并没有做太多工作。

The Unzip package is lean, and it did the job for me - it didn't have the bug that DotNetZip had. Also, it was a reasonably small file, relying upon the Microsoft BCL for the actual decompression. I could easily make adjustments which I needed (to be able to keep track of the progress while decompressing). I recommend it.

Unzip 包是精简的,它为我完成了这项工作 - 它没有 DotNetZip 的错误。此外,它是一个相当小的文件,依靠 Microsoft BCL 进行实际解压缩。我可以轻松地进行我需要的调整(以便能够在解压缩时跟踪进度)。我推荐它。

回答by Michael Blake

You can do it all within .NET 3.5 using DeflateStream. The thing lacking in .NET 3.5 is the ability to process the file header sections that are used to organize the zipped files. PKWare has published this information, which you can use to process the zip file after you create the structures that are used. It is not particularly onerous, and it a good practice in tool building without using 3rd party code.

您可以使用 DeflateStream 在 .NET 3.5 中完成所有操作。.NET 3.5 缺乏的是处理用于组织压缩文件的文件头部分的能力。PKWare 已发布此信息,您可以在创建使用的结构后使用这些信息处理 zip 文件。它不是特别繁重,并且是不使用 3rd 方代码的工具构建的好习惯。

It isn't a one line answer, but it is completely doable if you are willing and able to take the time yourself. I wrote a class to do this in a couple of hours and what I got from that is the ability to zip and unzip files using .NET 3.5 only.

这不是一个单一的答案,但如果您愿意并且能够自己花时间,它是完全可行的。我写了一门课来在几个小时内完成这项工作,我从中得到的是仅使用 .NET 3.5 压缩和解压缩文件的能力。

回答by Mister Epic

For .Net 4.5+

对于 .Net 4.5+

It is not always desired to write the uncompressed file to disk. As an ASP.Net developer, I would have to fiddle with permissions to grant rights for my application to write to the filesystem. By working with streams in memory, I can sidestep all that and read the files directly:

并非总是希望将未压缩的文件写入磁盘。作为 ASP.Net 开发人员,我将不得不摆弄权限以授予我的应用程序写入文件系统的权限。通过在内存中处理流,我可以避开所有这些并直接读取文件:

using (ZipArchive archive = new ZipArchive(postedZipStream))
{
    foreach (ZipArchiveEntry entry in archive.Entries)
    {
         var stream = entry.Open();
         //Do awesome stream stuff!!
    }
}

Alternatively, you can still write the decompressed file out to disk by calling ExtractToFile():

或者,您仍然可以通过调用将解压文件写入磁盘ExtractToFile()

using (ZipArchive archive = ZipFile.OpenRead(pathToZip))
{
    foreach (ZipArchiveEntry entry in archive.Entries)
    {
        entry.ExtractToFile(Path.Combine(destination, entry.FullName));
    }
} 

To use the ZipArchiveclass, you will need to add a reference to the System.IO.Compressionnamespace and to System.IO.Compression.FileSystem.

要使用ZipArchive该类,您需要添加对System.IO.Compression命名空间和System.IO.Compression.FileSystem.