C#从流中压缩和压缩csv

时间:2017-06-11 14:11:16

标签: c# .net csv zip mailmessage

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

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

mail.Attachments.Add(new Attachment(stream, "report.csv"));

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

1 个答案:

答案 0 :(得分:3)

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

public FileModel(){
    public string FileName {get;set;}
    public Stream FileStream {get;set;}
}

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

public static class ZipArchiveExtensions {    
    public static Stream Compress(this IEnumerable<FileModel> files) {
        if (files.Any()) {
            var ms = new MemoryStream();
            var archive = new ZipArchive(ms, ZipArchiveMode.Create, false);
            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);
            stream.Position = 0;
            stream.Close();
        }
        return entry;
    }
}

使用它,您现在可以在将压缩的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