2010-09-14 18 views
13

_data è un array di [] byte di dati allegati.da MemoryStream è vuoto

quando sto facendo questo:

var ms = new MemoryStream(_data.Length); 
ms.Write(_data,0,_data.Length); 
mailMessage.Attachments.Add(new Attachment(ms, attachment.Name)); 

allegato viene vuoto. In realtà Outlook mostra la dimensione del file, ma non è corretto.

Bene, ho pensato che ci fosse un problema nel mio _data. Poi ho deciso di provare questo approccio:

var ms = new MemoryStream(_data.Length); 
ms.Write(_data,0,_data.Length); 
fs = new FileStream(@"c:\Temp\"+attachment.Name,FileMode.CreateNew); 
fs.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length); 
fs.Flush(); 
fs.Close(); 
mailMessage.Attachments.Add(new Attachment(@"c:\Temp\" + attachment.Name)); 

E che funziona. Cosa c'è che non va nel primo?

risposta

34

Con la prima forma, non sei "riavvolgere" il flusso:

ms.Position = 0; 

Così stava cercando di leggere dal fine del torrente, dove non c'era alcun dato .

Un modo più semplice di creare il MemoryStream è usare solo il costruttore però:

var ms = new MemoryStream(_data); 
mailMessage.Attachments.Add(new Attachment(ms, attachment.Name)); 
+0

non aiuta, ho provato quello – Agzam

+0

@Ike: mostra il codice in cui hai provato. –

+2

oh .. aspetta ... In realtà è stato ... Sono sicuro che l'ho provato prima, e non ha funzionato. probabilmente mi sono incasinato con qualcos'altro ... – Agzam

4

Non utilizzare GetBuffer. Utilizzare ms.ToArray().

+0

problema nella prima parte non la seconda – Agzam

+1

@Ike: Aliostad faceva notare che il secondo frammento di ancora non è davvero giusto - è probabile che abbia problemi. –