C# 从流中压缩和压缩 csv

bee*_*ive 2 .net c# csv zip mailmessage

我有一个从 DataTable 中提取数据的 MemoryStream。目前,这会输入 MailMessage 附件并邮寄出附加到邮件的 csv。我需要做的是压缩和压缩它。

所以现在我正在遍历 DataTable 的每一行,添加适当的逗号,然后将其流式传输。它会生成一个包含数据的 .bin 文件。通过添加名称作为附件参数,它将作为有效的 csv 文件发送到客户端。

mail.Attachments.Add(new Attachment(stream, "report.csv"));
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我如何在将 csv 添加为附件之前对其进行压缩和压缩?最好没有外部库。谢谢你。

Nko*_*osi 5

对于以前的答案,使用这样的模型,

public FileModel(){
    public string FileName {get;set;}
    public Stream FileStream {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

定义了以下扩展方法来创建要流式传输的 zip 存档。

public static class ZipArchiveExtensions {    
    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);
                }
            }
            ms.Position = 0;
            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;
    }
}
Run Code Online (Sandbox Code Playgroud)

有了它,您现在可以在将压缩的 csv 文件添加为附件之前添加一个步骤

//...other code

var files = new FileModel[] {
    new FileModel {
        FileName = "report1.csv",
        FileStream = stream
    },
    new FileModel {
        FileName = "report2.xlsx",
        FileStream = stream2
    }
};

var zipStream = files.Compress();
mail.Attachments.Add(new Attachment(zipStream, "reports.zip"));

//...other code
Run Code Online (Sandbox Code Playgroud)