internal override bool Write(string fullFilename, long contentLength, Stream stream, out string md5, out ErrorCode error) { error = ErrorCode.None; md5 = null; if (String.IsNullOrEmpty(fullFilename)) { throw new ArgumentNullException(nameof(fullFilename)); } if (contentLength < 0) { throw new ArgumentException("Invalid content length."); } if (stream == null || !stream.CanRead) { throw new ArgumentException("Unable to read stream."); } try { if (contentLength < 1) { CreateEmptyFile(fullFilename); return(true); } else { int bytesRead = 0; byte[] buffer = new byte[_StreamReadBufferSize]; long bytesRemaining = contentLength; using (MemoryStream ms = new MemoryStream()) // so we can compute hash { using (FileStream fs = new FileStream(fullFilename, FileMode.OpenOrCreate)) { while (bytesRemaining > 0) { bytesRead = stream.ReadAsync(buffer, 0, _StreamReadBufferSize).Result; fs.Write(buffer, 0, bytesRead); ms.Write(buffer, 0, bytesRead); // so we can compute the hash bytesRemaining -= bytesRead; } } ms.Seek(0, SeekOrigin.Begin); md5 = Common.Md5(ms); } error = ErrorCode.Success; return(true); } } catch (Exception e) { error = SetErrorCode(e); return(false); } }
internal override bool WriteRange(string fullFilename, long position, long contentLength, Stream stream, out string md5, out ErrorCode error) { error = ErrorCode.None; md5 = null; if (String.IsNullOrEmpty(fullFilename)) { throw new ArgumentNullException(nameof(fullFilename)); } if (position < 0) { throw new ArgumentException("Position must be zero or greater"); } if (contentLength < 1) { throw new ArgumentException("Invalid content length."); } if (stream == null || !stream.CanRead) { throw new ArgumentException("Unable to read stream."); } try { using (FileStream fs = new FileStream(fullFilename, FileMode.OpenOrCreate)) { fs.Seek(position, SeekOrigin.Begin); int bytesRead = 0; byte[] buffer = new byte[_StreamReadBufferSize]; long bytesRemaining = contentLength; while (bytesRemaining > 0) { bytesRead = stream.ReadAsync(buffer, 0, _StreamReadBufferSize).Result; fs.Write(buffer, 0, bytesRead); bytesRemaining -= bytesRead; } // compute hash of the entire file if (fs.CanSeek) { fs.Seek(0, SeekOrigin.Begin); } md5 = Common.Md5(fs); error = ErrorCode.Success; return(true); } } catch (Exception e) { error = SetErrorCode(e); return(false); } }