如何使用C#压缩文件,不使用第三方API?

Est*_*aya 167 c# compression zip download

我很确定这不是重复的,所以请耐心等待一分钟.

如何在不使用任何第三方库的情况下以编程方式(C#)压缩文件(在Windows中)?我需要一个原生的Windows调用或类似的东西; 我真的不喜欢开始一个过程的想法,但如果我绝对不得不这样做.PInovke呼叫会好得多.

如果做不到这一点,让我告诉你我真正想要实现的目标:我需要能够让用户在一个请求中下载一组文档.有关如何实现这一目标的任何想法?

Gal*_*llo 289

如何在不使用任何第三方库的情况下以编程方式(C#)压缩文件(在Windows中)?

如果使用4.5+ Framework,现在有ZipArchiveZipFile类.

using (ZipArchive zip = ZipFile.Open("test.zip", ZipArchiveMode.Create))
{
    zip.CreateEntryFromFile(@"c:\something.txt", "data/path/something.txt");
}
Run Code Online (Sandbox Code Playgroud)

您需要添加对以下内容的引用:

  • System.IO.Compression
  • System.IO.Compression.FileSystem

对于.NET Core定位net46,您需要为其添加依赖项

  • System.IO.Compression
  • System.IO.Compression.ZipFile

示例project.json:

"dependencies": {
  "System.IO.Compression": "4.1.0",
  "System.IO.Compression.ZipFile": "4.0.1"
},

"frameworks": {
  "net46": {}
}
Run Code Online (Sandbox Code Playgroud)

对于.NET Core 2.0,只需添加一个简单的using语句即可:

  • 使用System.IO.Compression;

  • 因为问题是五年了,而这个答案只有两个月了.Derp :-P (11认同)
  • 为了防止任何人,第二个参数是文件条目.这是相对于解压缩文件夹提取文件的路径.在Windows 7中,我发现如果文件条目是完整路径,例如@"D:\ Temp\file1.pdf",则本机Windows提取程序将失败.如果您只是使用Directory.GetFiles()生成的文件名,则可能会遇到此问题.最好使用Path.GetFileName()为文件条目参数提取文件名. (5认同)
  • 这怎么没有得到更多的赞成?这是唯一的直接答案. (4认同)
  • @heliac仍然Stackoverflow thingie应该是一个问题和答案存储库,并在精神上最好的答案shoudl在顶部...(该死的,我知道这不起作用) (3认同)
  • 我似乎无法在4.5.2中找到这个? (2认同)
  • @ user3791372,您需要将引用显式添加到system.io.compression。仅仅拥有系统是行不通的。 (2认同)

Bri*_*ink 85

你在使用.NET 3.5吗?您可以使用ZipPackage类和相关类.它不仅仅是压缩文件列表,因为它需要为您添加的每个文件添加MIME类型.它可能会做你想要的.

我目前正在使用这些类来解决类似的问题,将几个相关文件存档到一个文件中进行下载.我们使用文件扩展名将下载文件与我们的桌面应用相关联.我们遇到的一个小问题是,不可能只使用像7-zip这样的第三方工具来创建zip文件,因为客户端代码无法打开它 - ZipPackage添加了一个描述内容类型的隐藏文件每个组件文件,如果缺少该内容类型文件,则无法打开zip文件.

  • 请注意,这并不总是相反.某些Zip文件不会使用ZipPackage类重新水合.使用ZipPackage制作的文件将会很好. (5认同)
  • (回答上面的"叹息":打开"引用"并添加(不合逻辑)"WindowsBase".) (2认同)

Jos*_*hua 11

我处于相同的情况,想要.NET而不是第三方库.正如上面提到的另一张海报,仅仅使用ZipPackage类(在.NET 3.5中引入)还不够.存档中必须包含一个附加文件,以便ZipPackage正常工作.如果添加了此文件,则可以直接从Windows资源管理器打开生成的ZIP包 - 没问题.

您所要做的就是将[Content_Types] .xml文件添加到存档的根目录,并为您希望包含的每个文件扩展名添加"默认"节点.添加后,我可以从Windows资源管理器中浏览包或以编程方式解压缩并读取其内容.

有关[Content_Types] .xml文件的更多信息,请访问:http://msdn.microsoft.com/en-us/magazine/cc163372.aspx

以下是[Content_Types] .xml(必须准确命名)文件的示例:

<?xml version="1.0" encoding="utf-8" ?>
<Types xmlns=
    "http://schemas.openxmlformats.org/package/2006/content-types">
  <Default Extension="xml" ContentType="text/xml" /> 
  <Default Extension="htm" ContentType="text/html" /> 
  <Default Extension="html" ContentType="text/html" /> 
  <Default Extension="rels" ContentType=
    "application/vnd.openxmlformats-package.relationships+xml" /> 
  <Default Extension="jpg" ContentType="image/jpeg" /> 
  <Default Extension="png" ContentType="image/png" /> 
  <Default Extension="css" ContentType="text/css" /> 
</Types>
Run Code Online (Sandbox Code Playgroud)

以及用于创建ZIP文件的C#:

var zipFilePath = "c:\\myfile.zip"; 
var tempFolderPath = "c:\\unzipped"; 

    using (Package package = ZipPackage.Open(zipFilePath, FileMode.Open, FileAccess.Read)) 
    { 
        foreach (PackagePart part in package.GetParts()) 
        { 
            var target = Path.GetFullPath(Path.Combine(tempFolderPath, part.Uri.OriginalString.TrimStart('/'))); 
            var targetDir = target.Remove(target.LastIndexOf('\\')); 

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

            using (Stream source = part.GetStream(FileMode.Open, FileAccess.Read)) 
            { 
                source.CopyTo(File.OpenWrite(target)); 
            } 
        } 
    } 
Run Code Online (Sandbox Code Playgroud)

注意:

  • 很好的示例,但它不会创建ZIP文件.它解压缩现有文件. (12认同)

FLI*_*KER 8

    private static string CompressFile(string sourceFileName)
    {
        using (ZipArchive archive = ZipFile.Open(Path.ChangeExtension(sourceFileName, ".zip"), ZipArchiveMode.Create))
        {
            archive.CreateEntryFromFile(sourceFileName, Path.GetFileName(sourceFileName));
        }
        return Path.ChangeExtension(sourceFileName, ".zip");
    }
Run Code Online (Sandbox Code Playgroud)