C#压缩并压缩流中的csv
我有一个MemoryStream,它从数据表中提取数据。目前,这将馈送到MailMessage附件中,并将附加到邮件的csv发送出去。我需要做的是压缩和压缩它 所以现在我正在遍历数据表的每一行,添加适当的逗号,并将其流式输出。它将生成一个包含数据的.bin文件。通过添加名称作为附件参数,它将作为有效的csv文件发送给客户端C#压缩并压缩流中的csv,c#,.net,csv,zip,mailmessage,C#,.net,Csv,Zip,Mailmessage,我有一个MemoryStream,它从数据表中提取数据。目前,这将馈送到MailMessage附件中,并将附加到邮件的csv发送出去。我需要做的是压缩和压缩它 所以现在我正在遍历数据表的每一行,添加适当的逗号,并将其流式输出。它将生成一个包含数据的.bin文件。通过添加名称作为附件参数,它将作为有效的csv文件发送给客户端 mail.Attachments.Add(new Attachment(stream, "report.csv")); 在将csv添加为附件之前,有谁能帮助我压缩和压缩cs
mail.Attachments.Add(new Attachment(stream, "report.csv"));
在将csv添加为附件之前,有谁能帮助我压缩和压缩csv吗?最好没有外部库。谢谢。对于前面的答案,对于这样的模型
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();
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;
}
}
将流直接传递给zip文件流,然后将该流传递给附件Thank@Nkosi GZipStream似乎是压缩流的类。如何确保最终用户解压时收到csv或Excel文件?感谢您的回答,我在.net core 2.2上尝试使用此解决方案时遇到此错误:
引发异常:System.IO.Compression.dll中的:“System.NotSupportedException:”来自ZipArchiveEntry的此流不支持搜索。“
”。这发生在stream.Position=0代码>@WiniciusIago在这种情况下,然后移除带有位置的线并关闭。using
块将处理流。这在早期版本的.net上运行良好。新版本中可能有一些变化。谢谢@Nikosi。它似乎可以工作,但附加的zip文件似乎无效(尽管是2,3mb,这是我所期望的大小)。我在linux上尝试打开zip文件时遇到此错误打开存档失败:不是zip存档
@WiniciusIago好的,请提供您正在执行的操作的一些背景信息,以便我们可以查看是否可以尝试缩小问题的范围。我正在尝试做与问题作者几乎相同的事情。我有一个大的csv,我需要通过电子邮件发送,该文件必须压缩,否则它可能会达到smtp服务器的最大限制。可能唯一的区别是我正在基于数据库查询在内存中生成csv。最后的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