带有crc变量详细信息的ICSharpCode.SharpZipLib.Zip示例

时间:2011-03-31 08:46:08

标签: c# memorystream sharpziplib

我正在使用icsharpziplib dll在asp.net中使用c#压缩共享点文件 当我打开output.zip文件时,它显示“zip文件已损坏或损坏”。 并且output.zip中文件的crc值显示为000000。

  1. 我们如何计算或使用icsharpziplib dll配置crc值
  2. 任何人都可以使用内存流进行压缩示例吗?

2 个答案:

答案 0 :(得分:2)

似乎你没有创建每个ZipEntry。

这是我根据自己的需求调整的代码: http://wiki.sharpdevelop.net/SharpZipLib-Zip-Samples.ashx#Create_a_Zip_fromto_a_memory_stream_or_byte_array_1

无论如何使用SharpZipLib,有很多方法可以使用zip文件:ZipFile类,ZipOutputStreamFastZip

我正在使用ZipOutputStream来创建内存中的ZIP文件,向其中添加内存流并最终刷新到磁盘,并且它的工作非常好。为什么选择ZipOutputStream?因为如果您想指定压缩级别并使用Streams,它是唯一可用的选项。

祝你好运:)

答案 1 :(得分:0)

1: 你可以手动完成它,但ICSharpCode库会为你处理它。我也发现了一些事情:“zip文件已损坏或损坏”也可能是由于未正确添加您的zip条目名称(例如位于子文件夹链中的条目)。

2: 我通过创建一个compressionHelper实用程序解决了这个问题。我不得不动态编写并返回zip文件。临时文件不是一个选项,因为该过程由Web服务运行。 这个技巧就是一个BeginZip(),AddEntry()和EndZip()方法(因为我把它变成了一个可以调用的实用程序。如果需要,你可以直接使用代码。)

我从示例中排除的是检查初始化(如首先错误地调用EndZip())和正确的处理代码(最好实现IDisposable并关闭zipfileStream和memoryStream(如果适用))。

using System.IO;
using ICSharpCode.SharpZipLib.Zip;

public void BeginZipUpdate()
    {
        _memoryStream = new MemoryStream(200);
        _zipOutputStream = new ZipOutputStream(_memoryStream);
    }

public void EndZipUpdate()
    {
        _zipOutputStream.Finish();
        _zipOutputStream.Close();
        _zipOutputStream = null;
    }

//Entry name could be 'somefile.txt' or 'Assemblies\MyAssembly.dll' to indicate a folder.
//Unsure where you'd be getting your file, I'm reading the data from the database.
public void AddEntry(string entryName, byte[] bytes)
    {
        ZipEntry entry = new ZipEntry(entryName);
        entry.DateTime = DateTime.Now;            
        entry.Size = bytes.Length;            
        _zipOutputStream.PutNextEntry(entry);
        _zipOutputStream.Write(bytes, 0, bytes.Length);
        _zipOutputStreamEntries.Add(entryName);
    }

所以你实际上是让zipOutputStream写入memoryStream。然后,一旦_zipOutputStream关闭,您就可以返回memoryStream的内容。

public byte[] GetResultingZipFile()
    {           
        _zipOutputStream.Finish();
        _zipOutputStream.Close();
        _zipOutputStream = null;
        return _memoryStream.ToArray();
    }

请注意您要添加到zipfile的数量(进程/ IO /超时等延迟)。