【问题标题】:SharpZipLib - adding a ZipEntry to a ZipFile throws a ZipExceptionSharpZipLib - 将 ZipEntry 添加到 ZipFile 会引发 ZipException
【发布时间】:2015-02-20 14:16:41
【问题描述】:

我正在尝试使用内存字符串中的文件创建 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();

但是它在 zip.Add(zipEntry);并抛出异常:

ZipException - 条目不能有任何数据

不知怎的,我不知道出了什么问题。

【问题讨论】:

    标签: c# sharpziplib


    【解决方案1】:

    您使用的 ZipFile.Add 方法覆盖用于将目录、卷标等添加到 zip 文件:如果您传递包含数据的 ZipEntry,则为 explicitly throws a ZipException

    根据the documentation,如果要将内存中的数据添加到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;
        }
    }
    

    【讨论】:

    • 非常好,它有效。但是我不得不承认这不是直观的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    相关资源
    最近更新 更多