Example #1
0
        /// <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);
        }