C#内存流csv文件未写入

p4tfgftt  于 2022-12-06  发布在  C#
关注(0)|答案(3)|浏览(192)

我正在写一个在内存中创建一个.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);
qq24tv8q

qq24tv8q1#

下面的行:

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

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

tw.Flush();

另一件需要注意的事情是,一旦数据被写入MemoryStreamMemoryStream的当前指针就位于数据的末尾。因此,要正确地将数据从MemoryStream复制到Attachment对象中,请将MemoryStream指针的位置重置为零(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
nlejzf6q

nlejzf6q2#

我强烈建议您使用using子句

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

它会自动刷新和关闭流。它的方式更容易和更“保存”的使用。
using-Statement Microsoft explanation

wqlqzqxt

wqlqzqxt3#

我想补充JoeGER 94的回答,如果下面的代码只有一条语句,那么在当前的net版本中不需要{}。

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

有关详细信息,请查找this question

相关问题