2010-09-22 11 views
10

Quelle est la meilleure méthode pour convertir un Stream en FileStream en utilisant C#.Convertir un flux en un FileStream en C#

La fonction sur laquelle je travaille a un flux qui lui a été transmis contenant des données téléchargées, et je dois pouvoir exécuter des méthodes stream.Read(), stream.Seek() qui sont des méthodes du type FileStream. Un casting simple ne fonctionne pas, donc je demande de l'aide ici.

+0

Pourquoi le moulage ne fonctionne-t-il pas? Quel est le type de votre objet Stream entrant? –

+2

C'est une opération absurde. Si le flux ne prend pas en charge 'Read/Seek', la conversion ne vous aidera pas. – zerkms

Répondre

18

Read et Seek sont des méthodes sur le type Stream, pas seulement FileStream. C'est juste que tous les flux ne les supportent pas. (Personnellement, je préfère utiliser le Position property sur appeler Seek, mais ils se résument à la même chose.)

Si vous préférez avoir les données en mémoire sur le dumping dans un fichier, pourquoi ne pas lire juste tout en MemoryStream ? Cela soutient la recherche. Par exemple:

public static MemoryStream CopyToMemory(Stream input) 
{ 
    // It won't matter if we throw an exception during this method; 
    // we don't *really* need to dispose of the MemoryStream, and the 
    // caller should dispose of the input stream 
    MemoryStream ret = new MemoryStream(); 

    byte[] buffer = new byte[8192]; 
    int bytesRead; 
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     ret.Write(buffer, 0, bytesRead); 
    } 
    // Rewind ready for reading (typical scenario) 
    ret.Position = 0; 
    return ret; 
} 

Utilisation:

using (Stream input = ...) 
{ 
    using (Stream memory = CopyToMemory(input)) 
    { 
     // Seek around in memory to your heart's content 
    } 
} 

Ceci est similaire à l'aide de la méthode Stream.CopyTo introduite dans .NET 4.

Si vous voulez effectivement d'écrire sur le système de fichiers, vous pouvez faire quelque chose de similaire qui écrit d'abord dans le fichier puis rembobine le flux ... mais alors vous devrez prendre soin de le supprimer par la suite, pour éviter de jeter des déchets sur votre disque avec des fichiers.