2

System.Net.Mail.Attachment オブジェクトに .csv データが含まれています。添付ファイルの内容をファイルに保存する必要があります。私はこれを試しました:

        var sb = new StringBuilder();
        sb.AppendLine("Accounts,JOB,Usage Count");


            sb.AppendLine("One,Two,Three");
            sb.AppendLine("One,Two,Three");
            sb.AppendLine("One,Two,Three");

        var stream = new MemoryStream(Encoding.ASCII.GetBytes(sb.ToString()));
        //Add a new attachment to the E-mail message, using the correct MIME type
        var attachment = new Attachment(stream, new ContentType("text/csv"))
        {
            Name = "theAttachment.csv"
        };


            var sr = new StreamWriter(@"C:\Blah\Look.csv");
            sr.WriteLine(attachment.ContentStream.ToString());
            sr.Close();

しかし、ファイルには「System.IO.MemoryStream」しかありません。そこにある実際のデータを取得する方法を教えてください。

ありがとう。

4

2 に答える 2

6

ToString任意のストリームを呼び出すことはできません。代わりに、次を使用する必要がありますCopyTo

using (var fs = new FileStream(@"C:\temp\Look.csv", FileMode.Create))
{
    attachment.ContentStream.CopyTo(fs);
}

これを使用して、例の最後の 3 行を置き換えます。デフォルトでToStringは、クラスが ToString をオーバーライドしない限り、その型の名前を返すだけです。ContentStream は単なる抽象ストリーム (実行時はMemoryStream) であるため、デフォルトの実装のみが存在します。

CopyTo.NET Framework 4 の新機能です。.NET Framework 4 を使用していない場合は、拡張メソッドを使用して模倣できます。

public static void CopyTo(this Stream fromStream, Stream toStream)
{
    if (fromStream == null)
        throw new ArgumentNullException("fromStream");
    if (toStream == null)
        throw new ArgumentNullException("toStream");

    var bytes = new byte[8092];
    int dataRead;
    while ((dataRead = fromStream.Read(bytes, 0, bytes.Length)) > 0)
        toStream.Write(bytes, 0, dataRead);
}

Gunnar Peipmanのブログでの拡張メソッドの功績

于 2013-10-14T12:47:36.210 に答える