【问题标题】:sharpziplib compressed files to be uncompressed externallysharpziplib 压缩文件要在外部解压缩
【发布时间】:2011-06-03 01:17:41
【问题描述】:

我有一个场景,我想使用 SharpZipLib 压缩电子邮件附件。然后最终用户将打开附件并解压缩附件。

最初使用 SharpZipLib 压缩的文件是否可以很容易地被其他程序为我的最终用户解压缩?

【问题讨论】:

    标签: c# .net asp.net compression sharpziplib


    【解决方案1】:

    这取决于您如何使用 SharpZipLib。使用此库压缩数据的方法不止一种。

    以下是创建 zip 文件的方法示例,您几乎可以在任何支持 zip 的应用程序中打开该文件:

    private static byte[] CreateZip(byte[] fileBytes, string fileName)
    {
        using (var memoryStream = new MemoryStream())
        using (var zipStream = new ZipOutputStream(memoryStream))
        {
            var crc = new Crc32();
            crc.Reset();
            crc.Update(fileBytes);
    
            var zipEntry =
                new ZipEntry(fileName)
                {
                    Crc = crc.Value,
                    DateTime = DateTime.Now,
                    Size = fileBytes.Length
                };
            zipStream.PutNextEntry(zipEntry);
            zipStream.Write(fileBytes, 0, fileBytes.Length);
            zipStream.Finish();
            zipStream.Close();
            return memoryStream.ToArray();
        }
    }
    

    用法:

    var fileBytes = File.ReadAllBytes(@"C:/1.xml");
    
    var zipBytes = CreateZip(fileBytes, "MyFile.xml");
    
    File.WriteAllBytes(@"C:/2.zip", zipBytes);
    

    此 CreateZip 方法针对内存中已有字节并且只想压缩它们并发送甚至不保存到磁盘的情况进行了优化。

    【讨论】:

    • "Deflate" 可能是一个误导性的名称,我认为它会生成原始的 DEFLATE 流,而不是 zip 文件。此外,我在风格上更喜欢在实现方法中采用输出流,并且(可选)进行返回 byte[] 的重载,它可以让您在使用示例中跳过对内存的写入。
    • @Simon Buchan - 关于放气 - 我同意,已修复。关于流 - 取决于您的要求,在我使用它的地方,我不需要将结果写入文件系统。我只是将数据发送到接受二进制数组的第 3 方 Web 服务。
    • @Alex 谢谢伙计。您的代码 def 压缩文件。我有一个棘手的情况,也许你可以帮忙。我正在从 csv 流 (csvStream) 生成一个 csv 文件 -> 使用您的函数结果压缩流 (compressedStream) -> new Attachment(compressedStream,content-type) 向我发送 2mb 邮件(之前是 34mb),但现在当我单击附加的 csv 文件时,它不可读,全部编码。任何建议如何在压缩后附加 csv 文件
    • 当你压缩它时,它不再是 csv 文件了。它是 zip 文件。所以它应该有 zip 文件扩展名。
    • 我正在使用您的 CreateZip 功能。我稍微改变了我的程序。我将物理文件名 xyz.csv 保存在临时文件夹中,然后想使用您的 CreateZip 函数将其压缩,是否需要发送整个路径而不是 MyFile.xml?