private void InternalCopyFile( FileStream sStream, FileStream dStream, FileInfo file ) { sStream.Seek( 0, SeekOrigin.Begin ); dStream.Seek( 0, SeekOrigin.Begin ); if( _CopyBuffer == null ) _CopyBuffer = new byte[2097152]; DateTime start = DateTime.Now; int sent = 0, totalSent = 0; int badCount = 0; int percent = 0; while( totalSent < file.Length ) { int chunkSize = ( int )Math.Min( ( long )_CopyBuffer.Length, sStream.Length - sStream.Position ); sStream.Read( _CopyBuffer, 0, chunkSize ); dStream.Write( _CopyBuffer, 0, chunkSize ); if( GetFlag( CopyFlags.Scan ) ) badCount += InternalScan( _CopyBuffer ); totalSent += chunkSize; _CopySize += chunkSize; sent += chunkSize; bool reset = false; if( _ClipBandwidth && start + TimeSpan.FromSeconds( 1.0 ) < DateTime.Now ) { reset = true; } else if( _ClipBandwidth && _MaxBandwidth == 0 ) { while( _MaxBandwidth == 0 ) { Thread.Sleep( 500 ); } reset = true; } else if( _ClipBandwidth && sent > _MaxBandwidth ) { int toSleep = 1000 - ( DateTime.Now.Millisecond - start.Millisecond ); Thread.Sleep( toSleep ); reset = true; } if( reset ) { sent = 0; start = DateTime.Now; } int nPercent = Utility.GetPercent( sStream.Position, sStream.Length ); if( percent < nPercent ) { percent = nPercent; if( OnCopyPercentChange != null ) OnCopyPercentChange( percent ); } nPercent = Utility.GetPercent( _CopySize, _CombinedFileSize ); if( _TotalPercent < nPercent ) { _TotalPercent = nPercent; if( OnTotalPercentChange != null ) OnTotalPercentChange( _TotalPercent ); } } if( GetFlag( CopyFlags.Scan ) && badCount > 0 ) _DamagedFiles.Add( new DamagedFile( file, badCount ) ); }