[英]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();
另一件需要注意的事情是,一旦数据被写入MemoryStream
, MemoryStream
的当前指针就在数据的末尾。 因此,要将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(...);
}
}
它会自动刷新并关闭流。 它使用起来更容易,也更“节省”。
我会在 JoeGER94 的回答中补充说,如果以下代码只是一个语句,则您不需要在 current.net 版本中使用 {}。
using(var memStream = new MemoryStream(...))
using(var textWriter = new TextWriter(memStream))
textWriter.WriteLine(...);
有关更多信息,请查找此问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.