Può capitare di dover salvare un MemoryStream su filesystem, per poi riprenderlo con qualche programma esterno e paciugarci su per creare qualcosa di.. hem.. magari inutile.. ma bello :)

Nel mio caso, dovevo prendere dei dati da un campo blob per poi passarli a dei programmi esterni di conversione.
In questo caso, il metodo più veloce che ho trovato è passare attraverso un array di byte e usare il metodo write dell'oggetto FileStream:

using (FileStream f = new FileStream(temporaryFileFullPath, FileMode.Create))
{
   int length = Convert.ToInt32(stream.Length);
   byte[] buffer = new byte[length];
   stream.Read(buffer, 0, length);
   f.Write(buffer,0, length);
}

Dove "stream" ovviamente è un oggetto di tipo MemoryStream. Col metodo Read riempio un buffer che poi passo all'oggetto FileStream.
Devo ancora capire se non ci siano metodi piu efficaci, per ora ho trovato questo.

Attenzione: il memoryStream espone un metodo GetBuffer. Questo metodo è disponibile solo se lo stream è stato creato da una matrice di byte in maniera pubblica, altrimenti restituisce un UnauthorizedException (guardate le note di msdn per capire quando e come si ha una matrice visible pubblicamente).

Nel mio caso, ho usato il costruttore standard del MemoryStream, quindi non potendo usare GetBuffer o dovuto usare il metodo Read (grazie Claudio, vada per il caffè ... anche se hai avuto culo :)) che però credo sia piu lento in quanto si deve risbobinare lo stream... domani farò qualche prova :)