Une manière élégante de consumr (tous les octets d’un) BinaryReader?

Existe-t-il un élégant pour émuler la méthode BinaryReader avec BinaryReader ? Peut-être pour mettre tous les octets dans un tableau d’octets?

Je fais ça:

 read1.ReadBytes((int)read1.BaseStream.Length); 

… mais il doit y avoir un meilleur moyen.

    Simplement faire:

     byte[] allData = read1.ReadBytes(int.MaxValue); 

    La documentation dit qu’il lira tous les octets jusqu’à la fin du stream.


    Mettre à jour

    Bien que cela semble élégant, et que la documentation semble indiquer que cela fonctionnerait, l’ implémentation réelle (cochée dans .NET 2, 3.5 et 4) alloue un tableau d’octets de taille complète pour les données, ce qui provoquera probablement une OutOfMemoryException sur un Système 32 bits.

    Par conséquent, je dirais qu’en fait, il n’ya pas de manière élégante .

    Au lieu de cela, je recommanderais la variation suivante de la réponse de @ iano. Cette variante ne repose pas sur .NET 4:
    Créez une méthode d’extension pour BinaryReader (ou Stream , le code est le même pour l’un ou l’autre).

     public static byte[] ReadAllBytes(this BinaryReader reader) { const int bufferSize = 4096; using (var ms = new MemoryStream()) { byte[] buffer = new byte[bufferSize]; int count; while ((count = reader.Read(buffer, 0, buffer.Length)) != 0) ms.Write(buffer, 0, count); return ms.ToArray(); } } 

    Il n’y a pas de moyen facile de faire cela avec BinaryReader. Si vous ne connaissez pas le nombre que vous devez lire à l’avance, il vaut mieux utiliser MemoryStream:

     public byte[] ReadAllBytes(Stream stream) { using (var ms = new MemoryStream()) { stream.CopyTo(ms); return ms.ToArray(); } } 

    Pour éviter la copie supplémentaire lors de l’appel à ToArray() , vous pouvez retourner la Position et la mémoire tampon via GetBuffer() .

    Pour copier le contenu d’un stream vers un autre, j’ai résolu la lecture de “quelques” octets jusqu’à la fin du fichier:

     private const int READ_BUFFER_SIZE = 1024; using (BinaryReader reader = new BinaryReader(responseStream)) { using (BinaryWriter writer = new BinaryWriter(File.Open(localPath, FileMode.Create))) { int byteRead = 0; do { byte[] buffer = reader.ReadBytes(READ_BUFFER_SIZE); byteRead = buffer.Length; writer.Write(buffer); byteTransfered += byteRead; } while (byteRead == READ_BUFFER_SIZE); } } 

    Une autre approche à ce problème consiste à utiliser les méthodes d’extension C #:

     public static class StreamHelpers { public static byte[] ReadAllBytes(this BinaryReader reader) { // Pre .Net version 4.0 const int bufferSize = 4096; using (var ms = new MemoryStream()) { byte[] buffer = new byte[bufferSize]; int count; while ((count = reader.Read(buffer, 0, buffer.Length)) != 0) ms.Write(buffer, 0, count); return ms.ToArray(); } // .Net 4.0 or Newer using (var ms = new MemoryStream()) { stream.CopyTo(ms); return ms.ToArray(); } } } 

    L’utilisation de cette approche permettra à la fois le code réutilisable et le code lisible.