0

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

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

2 回答 2

2

看来您没有创建每个 ZipEntry。

这是我适应我需要的代码: http ://wiki.sharpdevelop.net/SharpZipLib-Zip-Samples.ashx#Create_a_Zip_fromto_a_memory_stream_or_byte_array_1

无论如何,使用 SharpZipLib,您可以通过多种方式使用 zip 文件:ZipFile类、theZipOutputStreamFastZip.

我正在使用 ZipOutputStream 创建一个内存 ZIP 文件,将内存流添加到它,最后刷新到磁盘,它工作得很好。为什么选择 ZipOutputStream?因为如果您想指定压缩级别并使用Streams.

祝你好运 :)

于 2011-07-13T07:56:55.127 回答
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/超时等)。

于 2011-08-15T15:31:48.790 回答