我正在使用 icsharpziplib dll 在 asp.net 中使用 c# 压缩共享点文件
当我打开 output.zip 文件时,它显示“zip 文件已损坏或损坏”。output.zip 中文件的 crc 值显示为 000000。
- 我们如何使用 icsharpziplib dll 计算或配置 crc 值?
- 任何人都可以举出如何使用内存流进行压缩的好例子吗?
我正在使用 icsharpziplib dll 在 asp.net 中使用 c# 压缩共享点文件
当我打开 output.zip 文件时,它显示“zip 文件已损坏或损坏”。output.zip 中文件的 crc 值显示为 000000。
看来您没有创建每个 ZipEntry。
这是我适应我需要的代码: http ://wiki.sharpdevelop.net/SharpZipLib-Zip-Samples.ashx#Create_a_Zip_fromto_a_memory_stream_or_byte_array_1
无论如何,使用 SharpZipLib,您可以通过多种方式使用 zip 文件:ZipFile
类、theZipOutputStream
和FastZip
.
我正在使用 ZipOutputStream 创建一个内存 ZIP 文件,将内存流添加到它,最后刷新到磁盘,它工作得很好。为什么选择 ZipOutputStream?因为如果您想指定压缩级别并使用Streams
.
祝你好运 :)
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/超时等)。