C# 压缩/解压缩文件夹&;文件夹

C# 压缩/解压缩文件夹&;文件夹,c#,.net,file,compression,C#,.net,File,Compression,有人知道用C#快速压缩或解压缩文件和文件夹的好方法吗?处理大文件可能是必要的。从.Net 1.1开始,唯一可用的方法是访问java库 不确定这在最近的版本中是否发生了变化。我一直使用SharpZip库 正如汤姆所指出的,你可以使用a 另一种方法(不使用第三方)是使用WindowsShellAPI。您需要在C#项目中设置对Microsoft Shell控件和自动化COM库的引用。杰拉尔德·吉布森的例子如下: 这在java中很容易做到,如上所述,您可以从C#访问java.util.zip库。参考资

有人知道用C#快速压缩或解压缩文件和文件夹的好方法吗?处理大文件可能是必要的。

从.Net 1.1开始,唯一可用的方法是访问java库


不确定这在最近的版本中是否发生了变化。

我一直使用SharpZip库

正如汤姆所指出的,你可以使用a

另一种方法(不使用第三方)是使用WindowsShellAPI。您需要在C#项目中设置对Microsoft Shell控件和自动化COM库的引用。杰拉尔德·吉布森的例子如下:


这在java中很容易做到,如上所述,您可以从C#访问java.util.zip库。参考资料见:



不久前,我用它对文件夹结构进行了深度(递归)压缩,但我认为我从未使用过解压缩。如果我有这样的动机,我可能会把代码拉出来,稍后在这里编辑。

Net 2.0 framework命名空间
System.IO.Compression
支持GZip和Deflate算法。这里有两种方法可以压缩和解压从文件对象获得的字节流。您可以在下面的方法中用
GZipStream
替换
DefaultStream
,以使用该算法。不过,这仍然存在使用不同算法处理压缩文件的问题

public static byte[] Compress(byte[] data)
{
    MemoryStream output = new MemoryStream();

    GZipStream gzip = new GZipStream(output, CompressionMode.Compress, true);
    gzip.Write(data, 0, data.Length);
    gzip.Close();

    return output.ToArray();
}

public static byte[] Decompress(byte[] data)
{
    MemoryStream input = new MemoryStream();
    input.Write(data, 0, data.Length);
    input.Position = 0;

    GZipStream gzip = new GZipStream(input, CompressionMode.Decompress, true);

    MemoryStream output = new MemoryStream();

    byte[] buff = new byte[64];
    int read = -1;

    read = gzip.Read(buff, 0, buff.Length);

    while (read > 0)
    {
        output.Write(buff, 0, read);
        read = gzip.Read(buff, 0, buff.Length);
    }

    gzip.Close();

    return output.ToArray();
}

另一个好的选择也是。

是一个非常好的实用工具。

我的答案是闭上眼睛,选择。它已经过大型社区的测试。

您可以使用以下方法创建zip文件:

public异步任务CreateZipFile(字符串sourceDirectoryPath,字符串名称)
{
var path=HostingEnvironment.MapPath(TempPath)+name;
等待任务。运行(()=>
{
如果(File.Exists(path))File.Delete(path);
CreateFromDirectory(sourceDirectoryPath,path);
});
返回路径;
}
然后您可以使用以下方法解压缩文件:

1-此方法适用于zip文件路径

public async Task ExtractZipFile(字符串文件路径,字符串destinationDirectoryName)
{
等待任务。运行(()=>
{
var archive=ZipFile.Open(filePath,ZipArchiveMode.Read);
foreach(archive.Entries中的var条目)
{
ExtractToFile(Path.Combine(destinationDirectoryName,entry.FullName),true);
}
archive.Dispose();
});
}
2-此方法适用于zip文件流

公共异步任务提取zipFile(流zipFile,字符串destinationDirectoryName)
{
字符串filePath=HostingEnvironment.MapPath(TempPath)+Utility.GetRandomNumber(1,int.MaxValue);
使用(FileStream输出=新的FileStream(filePath,FileMode.Create))
{
等待zipFile.CopyToAsync(输出);
}
wait Task.Run(()=>ZipFile.extractodirectory(filePath,destinationDirectoryName));
等待任务。运行(()=>File.Delete(filePath));
}
注意:几年前,我在SharpZip代码中发现了一个int-overflow错误,导致它在碰巧具有正确值组合的随机文件上失败。不确定这是否得到了修复,但我从内存中将SharpZip源代码中的
int
变量更改为
long
,以避免溢出。我将不得不试着找到我的旧的固定邮政编码,并检查它是否匹配最新的。