コード例 #1
0
 internal static bool CopyStream(Stream source, Stream target, int bufferSize, long sourceSeekOffset, SeekOrigin sourceSeekOrigin, long targetSetLength, long targetSeekOffset, SeekOrigin targetSeekOrigin, Operation <int, bool> shouldCancel)
 {
     SharedUtil.ThrowIfEmpty(source, "source");
     SharedUtil.ThrowIfEmpty(target, "target");
     if (!source.CanRead || !target.CanWrite)
     {
         throw new IOException();
     }
     byte[] buffer = new byte[bufferSize = (bufferSize <= 0) ? 0x1000 : bufferSize];
     if (((sourceSeekOffset > 0L) || ((sourceSeekOffset == 0L) && (sourceSeekOrigin != SeekOrigin.Current))) && source.CanSeek)
     {
         source.Seek(sourceSeekOffset, sourceSeekOrigin);
     }
     if (target.CanSeek)
     {
         if (targetSetLength > 0L)
         {
             target.SetLength(targetSetLength);
         }
         target.Seek(targetSeekOffset, targetSeekOrigin);
     }
     while (source.Position < source.Length)
     {
         long num;
         if ((num = source.Length - source.Position) < bufferSize)
         {
             bufferSize = (int)num;
             buffer     = new byte[bufferSize];
         }
         source.Read(buffer, 0, bufferSize);
         target.Write(buffer, 0, bufferSize);
         target.Flush();
         if ((shouldCancel != null) && shouldCancel(SharedUtil.Percent(source.Position, source.Length)))
         {
             return(false);
         }
     }
     return(true);
 }