Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#压缩并压缩流中的csv_C#_.net_Csv_Zip_Mailmessage - Fatal编程技术网

C#压缩并压缩流中的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

我有一个MemoryStream,它从数据表中提取数据。目前,这将馈送到MailMessage附件中,并将附加到邮件的csv发送出去。我需要做的是压缩和压缩它

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

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