从内存中的List <byte []>创建Zip文件

时间:2016-04-20 18:36:20

标签: c# .net asp.net-mvc zip

我有一个返回文件列表的Web服务。像这样:

public FileModel(){
  string FileName {get;set;}
  byte[] FileStream {get;set;}
  string FileType {get;set;} 
}

我的服务将返回:

  List<FileModel> files;

我必须将此列表返回给浏览器,因此我需要将这些文件压缩到zip文件夹中。

但是,我无法弄清楚如何执行此操作,因为.NET ZipArchive CreateFromDirectory要求我提供要压缩文件的目录。但我没有目录,我只有这个列表。如何将此列表转换为压缩文件夹。

1 个答案:

答案 0 :(得分:2)

给出

public FileModel(){
    string FileName {get;set;}
    byte[] FileStream {get;set;}
    string FileType {get;set;} 
}

以下内容是为了创建一个zip文件

而编写的
static class FileModelCompression {

    public static Stream Compress(this IEnumerable<FileModel> files) {
        if (files.Any()) {
            var ms = new MemoryStream();
            using(var archive = new ZipArchive(ms, ZipArchiveMode.Create, leaveOpen: true)) {
                foreach (var file in files) {
                    var entry = archive.add(file);
                }
            }// disposal of archive will force data to be written to memory stream.
            ms.Position = 0; //reset memory stream position.
            return ms;
        }
        return null;
    }

    private static ZipArchiveEntry add(this ZipArchive archive, FileModel file) {
        var entry = archive.CreateEntry(file.FileName, CompressionLevel.Fastest);
        using (var stream = entry.Open()) {
            file.FileStream.CopyTo(stream);
        }
        return entry;
    }
}