我正在使用icsharpziplib dll在asp.net中使用c#压缩共享点文件 当我打开output.zip文件时,它显示“zip文件已损坏或损坏”。 并且output.zip中文件的crc值显示为000000。
答案 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
类,ZipOutputStream
和FastZip
。
我正在使用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 /超时等延迟)。