/// <summary> /// Wirte stream data to byte array. /// </summary> /// <param name="stream">data write to byte array</param> /// <param name="progressListener">progress</param> /// <returns>bytes from stream</returns> public static byte[] StreamToBytes(Stream stream, IProgressListener progressListener) { if (stream == null) { throw new ArgumentNullException("stream must not be null."); } byte[] bytes; // Content length known? if (stream.CanSeek) { bytes = new byte[stream.Length]; int bytesRead = 0; int offset = 0; //reader.Read while (offset < stream.Length && (bytesRead = stream.Read(bytes, offset, (int)(bytes.Length - offset))) > 0) { offset += bytesRead; if (progressListener != null) { progressListener.updateProgress((int)(100 * offset / bytes.Length)); } } if (offset != (int)bytes.Length) { throw new IOException("Unexpected read size. current: " + offset + ", excepted: " + bytes.Length); } } else { // Content length is unknown - need to read until EOF byte[] buffer = new byte[BUFFER_SIZE]; using (MemoryStream outputStream = new MemoryStream()) { try { //int offset = 0; while (true) { int bytesRead = stream.Read(buffer, 0, buffer.Length); if (bytesRead == 0) { break; } outputStream.Write(buffer, 0, bytesRead); } } catch (ArgumentOutOfRangeException) { } outputStream.Position = 0; bytes = new byte[outputStream.Length]; outputStream.Read(bytes, 0, bytes.Length); } } return(bytes); }