如何使用C#4.0从文件夹解压缩所有.Zip文件,而不使用任何OpenSource Dll?

时间:2013-04-17 06:15:54

标签: c# unzip zipfile

我有一个包含 .ZIP文件的文件夹。现在,我想使用C#将ZIP文件解压缩到特定文件夹,但不使用任何外部程序集或.Net Framework 4.5。

我已搜索过,但未找到任何使用Framework 4.0或更低版本解压缩* .zip文件的解决方案。

我尝试过GZipStream,但它只支持.gz而不支持.zip文件。

7 个答案:

答案 0 :(得分:30)

以下是msdn的示例。 System.IO.Compression.ZipFile就是为此而做的:

using System;
using System.IO;
using System.IO.Compression;

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

            ZipFile.CreateFromDirectory(startPath, zipPath);

            ZipFile.ExtractToDirectory(zipPath, extractPath);
        }
    }
}

编辑:抱歉,我错过了您对.NET 4.0及更低版本的兴趣。 必需的.NET framework 4.5及更高版本。

答案 1 :(得分:14)

我有同样的问题,发现了一篇非常简单的文章解决了这个问题。 http://www.fluxbytes.com/csharp/unzipping-files-using-shell32-in-c/

你需要参考 COM库称为Microsoft Shell控件和自动化(Interop.Shell32.dll)

代码(从文章中未触及,只是让你看到它有多简单):

public static void UnZip(string zipFile, string folderPath)
{
    if (!File.Exists(zipFile))
        throw new FileNotFoundException();

    if (!Directory.Exists(folderPath))
        Directory.CreateDirectory(folderPath);

    Shell32.Shell objShell = new Shell32.Shell();
    Shell32.Folder destinationFolder = objShell.NameSpace(folderPath);
    Shell32.Folder sourceFile = objShell.NameSpace(zipFile);

    foreach (var file in sourceFile.Items())
    {
        destinationFolder.CopyHere(file, 4 | 16);
    }
}

强烈推荐阅读这篇文章 - 他为旗帜4 | 16

带来了一次表达

编辑:几年后我的应用程序运行了,我收到两个用户的投诉,突然之间应用程序停止了工作。 似乎CopyHere函数创建了临时文件/文件夹,但这些文件/文件夹从未被删除而导致出现问题。 可以在System.IO.Path.GetTempPath()。

中找到这些文件的位置

答案 2 :(得分:1)

ZipPackage可能是一个开始的地方。它位于System.IO.Packaging内,可在.NET 4.0中使用

并不是上面提到的.NET 4.5方法的简单性,但看起来它可以做你想要的。

答案 3 :(得分:0)

.NET 3.5有一个DeflateStream。您必须为目录等信息创建结构,但PKWare已发布此信息。我编写了一个解压缩实用程序,一旦为它创建了结构,它就不会特别繁琐。

答案 4 :(得分:0)

我遇到了同样的问题并通过C#代码通过cmd shell调用7-zip可执行文件解决了这个问题,如下所示,

string zipped_path = "xxx.7z";
string unzipped_path = "yyy";
string arguments = "e " + zipped_path + " -o" + unzipped_path;

System.Diagnostics.Process process
         = Launch_in_Shell("C:\\Program Files (x86)\\7-Zip\\","7z.exe", arguments);

if (!(process.ExitCode == 0))
     throw new Exception("Unable to decompress file: " + zipped_path);

Launch_in_Shell(...)定义为,

public static System.Diagnostics.Process Launch_in_Shell(string WorkingDirectory,
                                                         string FileName, 
                                                         string Arguments)
{
       System.Diagnostics.ProcessStartInfo processInfo 
                                         = new System.Diagnostics.ProcessStartInfo();

        processInfo.WorkingDirectory = WorkingDirectory;
        processInfo.FileName = FileName;
        processInfo.Arguments = Arguments;
        processInfo.UseShellExecute = true;
        System.Diagnostics.Process process 
                                      = System.Diagnostics.Process.Start(processInfo);

        return process;
}

缺点:你需要在你的机器上安装7zip,我只尝试使用“.7z”文件。希望这会有所帮助。

答案 5 :(得分:0)

您可以使用DotNetZip(开源)     `

string zipFilePath = "C:\\sample.zip";
string extractedFilePath = "C:\\sampleFolder";

ZipFile zipfile = ZipFile.Read(zipFilePath); 
if (!Directory.Exists(extractedFilePath))
    Directory.CreateDirectory(extractedFilePath); 

foreach (ZipEntry e in zipfile)
{
        e.Extract(extractedFilePath,ExtractExistingFileAction.OverwriteSilently);
}`

答案 6 :(得分:-1)

在.net 4.0中,Deflate和GZip无法处理Zip文件,但您可以使用shell函数解压缩文件。

public FolderItems Extract()
{
 var shell = new Shell();
 var sf = shell.NameSpace(_zipFile.Path);
 return sf.Items();
}

调用extract函数时,可以按

保存返回的folderItems
    FolderItems Fits = Extract();
    foreach( var s in Fits)
    {
       shell.Namespace("TargetFolder").copyhere(s); 

    }