SharpZipLib - 将 ZipEntry 添加到 ZipFile 会引发 ZipException

And*_*zej 2 c# sharpziplib

我正在尝试使用内存字符串中的文件创建 ZIP 并保存它。到目前为止,这是我的代码:

var zip = ZipFile.Create(Path.Combine(outputPath, fileName));
zip.BeginUpdate();

var fileStream = new MemoryStream(Encoding.Default.GetBytes(myStringVariable));
var outputMemStream = new MemoryStream();
var zipStream = new ZipOutputStream(outputMemStream);
var zipEntry = new ZipEntry("file.html");

zipEntry.DateTime = DateTime.Now;
zipStream.PutNextEntry(zipEntry);
StreamUtils.Copy(fileStream, zipStream, new byte[4096]);
zipStream.CloseEntry();
zip.Add(zipEntry);

zip.CommitUpdate();
zip.Close();
Run Code Online (Sandbox Code Playgroud)

然而它在 zip.Add(zipEntry); 上中断了。并抛出异常:

ZipException - 条目不能有任何数据

不知何故,我无法弄清楚出了什么问题。

pix*_*ger 5

您使用的方法ZipFile.Add覆盖用于将目录、卷标等添加到 zip 文件:如果您传递包含数据,它会显式抛出 aZipExceptionZipEntry

根据文档,如果要将内存中的数据添加到 a 中ZipFile,则需要使用Add(IStaticDataSource dataSource, string entryName)覆盖。您还需要创建一个实现IStaticDataSource(下面的实现取自文档页面)。

所以你的代码会是这样的:

void Main()
{
    string outputPath = @"C:\Scratch\test.zip";
    string myStringVariable = "<html><head><title>Title</title></head><body>Hello World</body></html>";

    var zip = ZipFile.Create(outputPath);
    zip.BeginUpdate();

    var fileStream = new MemoryStream(Encoding.Default.GetBytes(myStringVariable));

    var dataSource = new CustomStaticDataSource();
    dataSource.SetStream(fileStream);

    zip.Add(dataSource, "file.html");

    zip.CommitUpdate();
    zip.Close();
}

public class CustomStaticDataSource : IStaticDataSource {
    private Stream _stream;
    // Implement method from IStaticDataSource
    public Stream GetSource() {
        return _stream;
    }

    // Call this to provide the memorystream
    public void SetStream(Stream inputStream) {
        _stream = inputStream;
        _stream.Position = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)