Copia MemoryStream in FileStream e salva il file?

Non capisco cosa sto facendo male qui. Genero un paio di flussi di memoria e in modalità debug vedo che sono popolati. Ma quando provo a copiare MemoryStream su FileStream per salvare il file, fileStream non viene popolato e il file è lungo 0 byte (vuoto).

Ecco il mio codice

 if (file.ContentLength > 0) { var bytes = ImageUploader.FilestreamToBytes(file); // bytes is populated using (var inStream = new MemoryStream(bytes)) // inStream is populated { using (var outStream = new MemoryStream()) { using (var imageFactory = new ImageFactory()) { imageFactory.Load(inStream) .Resize(new Size(320, 0)) .Format(ImageFormat.Jpeg) .Quality(70) .Save(outStream); } // outStream is populated here var fileName = "test.jpg"; using (var fileStream = new FileStream(Server.MapPath("~/content/u/") + fileName, FileMode.CreateNew, FileAccess.ReadWrite)) { outStream.CopyTo(fileStream); // fileStream is not populated } } } } 

È necessario ripristinare la posizione del stream prima di copiare.

 outStream.Position = 0; outStream.CopyTo(fileStream); 

Hai usato outStream quando salvi il file usando imageFactory . Quella funzione popolava outStream . Mentre si popola outStream la posizione viene impostata alla fine dell’area popolata. È così che quando si continua a scrivere byte sul vapore, non sovrascrive i byte esistenti. Ma poi per leggerlo (a scopo di copia) è necessario impostare la posizione all’inizio in modo da poter iniziare a leggere all’inizio.

Se il tuo objective è semplicemente scaricare il stream di memoria su un file fisico (ad esempio per esaminare il contenuto), può essere fatto in una sola mossa:

 memoryStream.Position = 0; System.IO.File.WriteAllBytes(@"C:\\filename", memoryStream.ToArray());