88 votes

Comment obtenir un MemoryStream à partir d'un Stream en .NET ?

J'ai la méthode de construction suivante qui ouvre un fichier de type MemoryStream à partir d'un chemin de fichier :

MemoryStream _ms;

public MyClass(string filePath)
{
    byte[] docBytes = File.ReadAllBytes(filePath);
    _ms = new MemoryStream();
    _ms.Write(docBytes, 0, docBytes.Length);
}

Je dois changer cela pour accepter un Stream au lieu d'un chemin de fichier. Quel est le moyen le plus simple et le plus efficace d'obtenir un nom de fichier. MemoryStream de la Stream objet ?

231voto

Phil Devaney Points 8595

En .NET 4, vous pouvez utiliser Stream.CopyTo pour copier un flux, au lieu des méthodes maison listées dans les autres réponses.

MemoryStream _ms;

public MyClass(Stream sourceStream)

    _ms = new MemoryStream();
    sourceStream.CopyTo(_ms);
}

67voto

Sahil Jain Points 701

Utilisez ça :

var memoryStream = new MemoryStream();
stream.CopyTo(memoryStream);

Cela permettra de convertir Stream a MemoryStream .

33voto

Justin Niessner Points 144953

Si vous modifiez votre classe pour accepter un Stream au lieu d'un nom de fichier, ne prenez pas la peine de convertir en MemoryStream. Laissez le Stream sous-jacent gérer les opérations :

public class MyClass
{ 
    Stream _s;

    public MyClass(Stream s) { _s = s; }
}

Mais si vous avez vraiment besoin d'un MemoryStream pour des opérations internes, vous devrez copier les données du Stream source dans le MemoryStream :

public MyClass(Stream stream)
{
    _ms = new MemoryStream();
    CopyStream(stream, _ms);
}

// Merged From linked CopyStream below and Jon Skeet's ReadFully example
public static void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[16*1024];
    int read;
    while((read = input.Read (buffer, 0, buffer.Length)) > 0)
    {
        output.Write (buffer, 0, read);
    }
}

5voto

Junto Points 5597

Vous pouvez simplement le faire :

var ms = new MemoryStream(File.ReadAllBytes(filePath));

La position du flux est 0 et prête à être utilisée.

3voto

rakuo15 Points 746

Vous devrez lire toutes les données de l'objet Stream dans un objet byte[] et le passe ensuite dans le MemoryStream via son constructeur. Il peut être préférable d'être plus spécifique quant au type d'objet de flux que vous utilisez. Stream est très générique et peut ne pas mettre en œuvre le Length ce qui est plutôt utile lors de la lecture de données.

Voici un code pour vous :

public MyClass(Stream inputStream) {
    byte[] inputBuffer = new byte[inputStream.Length];
    inputStream.Read(inputBuffer, 0, inputBuffer.Length);

    _ms = new MemoryStream(inputBuffer);
}

Si le Stream n'implémente pas la fonction Length vous devrez implémenter quelque chose comme ceci :

public MyClass(Stream inputStream) {
    MemoryStream outputStream = new MemoryStream();

    byte[] inputBuffer = new byte[65535];
    int readAmount;
    while((readAmount = inputStream.Read(inputBuffer, 0, inputBuffer.Length)) > 0)
        outputStream.Write(inputBuffer, 0, readAmount);

    _ms = outputStream;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X