繁体   English   中英

C# MemoryStream csv 文件未写入

[英]C# MemoryStream csv file not writing

我正在写一些东西,它将在 memory 和 email 中创建一个 .csv 文件作为附件。 下面的代码成功地通过电子邮件发送了一个 .csv 文件,但它是空的。 我确定我错过了一些简单的东西......

        MemoryStream memoryStream = new MemoryStream();
        TextWriter tw = new StreamWriter(memoryStream);

        tw.WriteLine("test,hello");
        tw.WriteLine("1234,543");

        Attachment attachment = new Attachment(memoryStream, new ContentType("text/csv"));
        attachment.Name = "test.csv";

        var Smtp = new SmtpClient();
        Smtp.UseDefaultCredentials = false;
        var NetworkCredentials = new NetworkCredential() { UserName = "NOPE@gmail.com", Password = "NO" };
        Smtp.Port = 587;
        Smtp.EnableSsl = true;
        Smtp.Host = "smtp.gmail.com";
        Smtp.Credentials = NetworkCredentials;

        MailMessage msg = new MailMessage();
        msg.From = new MailAddress("NAY@gmail.com");
        msg.To.Add("X@gmail.com");
        msg.Subject = "subject text";
        msg.Body = "Attached is a file.";
        msg.Attachments.Add(attachment);
        Smtp.Send(msg);

以下几行:

    tw.WriteLine("test,hello");
    tw.WriteLine("1234,543");

给人一种他们已经将数据写入MemoryStream的印象,但此时数据仍在缓冲区中。 为了实际写入它,您需要将数据刷新出来,这可以通过在上面的代码之后添加这一行来完成:

tw.Flush();

另一件需要注意的事情是,一旦数据被写入MemoryStreamMemoryStream的当前指针就在数据的末尾。 因此,要将MemoryStream中的数据正确复制到Attachment object 中,请将MemoryStream指针的 position 重置为零 (0),以便它可以从头开始复制整个数据。 这一行将完成这项工作:

memoryStream.position = 0;

因此,您的代码片段的初始部分应如下所示:

MemoryStream memoryStream = new MemoryStream();
TextWriter tw = new StreamWriter(memoryStream);

tw.WriteLine("test,hello");
tw.WriteLine("1234,543");

tw.Flush();
memoryStream.position = 0;

//rest of your code

我强烈建议您使用 using 子句

using(var memStream = new MemoryStream(...))
{
    using(var textWriter = new TextWriter(memStream))
    {
        textWriter.WriteLine(...);
    }
}

它会自动刷新并关闭流。 它使用起来更容易,也更“节省”。

using-Statement 微软解释

我会在 JoeGER94 的回答中补充说,如果以下代码只是一个语句,则您不需要在 current.net 版本中使用 {}。

using(var memStream = new MemoryStream(...))
using(var textWriter = new TextWriter(memStream))  
textWriter.WriteLine(...);

有关更多信息,请查找此问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM