rendered paste bodyprivate 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 ) );
}