Я использую пару файлов io.filestreams для копирования файла, чтобы я мог следить за ходом файла во время его копирования. Тем не менее, скорость копирования кажется странной по сравнению с системной копией. Файл копируется с локального компьютера на удаленный компьютер (с UNC-путем) и выглядит согласованным независимо от компьютера.
Для справки: если файл копируется путем перетаскивания файла, это занимает приблизительно 13 секунд, и индикатор выполнения копирования файла Windows отражает это соответствующим образом.
Если я копирую файл с моим кодом, «индикатор выполнения» показывает, что все байты были скопированы за одну секунду, тогда примерно в течение 12 секунд задерживается, когда поток файлов, выполняющий чтение, закрывается.
Я пытался очистить потоки во время записи, но это, похоже, не имеет никакого эффекта. Почему байты так быстро записываются, что происходит задержка при выходе кода из цикла Filestream Using?
Вот метод, который я использую:
Public Sub CopyFileInByteChunks(SourcePathFile As String, DestinationPathFile As String, NumberOf1KByteChunks As Long)
Dim CopyBufferSize As Long = 1024 * 1024
Console.WriteLine("START")
Using sr = New IO.FileStream(SourcePathFile, IO.FileMode.Open, FileAccess.Read)
Using sw = New IO.FileStream(DestinationPathFile, IO.FileMode.Create)
Dim ThisFileBytesSoFar As Long = 0
sw.SetLength(sr.Length) 'Ensures that the write out will be in contiguous bytes on the device (disk)
Dim byteData(CopyBufferSize) As Byte
Dim bytesRead As Long
Do
bytesRead = sr.Read(byteData, 0, CopyBufferSize) 'read 1 buffer worth of data
ThisFileBytesSoFar += bytesRead 'for prog bar
sw.Write(byteData, 0, bytesRead)
Console.WriteLine(ThisFileBytesSoFar)
If bytesRead = 0 Then
Exit Do
End If
Loop
Console.WriteLine("Completed Copy Loop")
End Using
Console.WriteLine("Exited Writer Using")
End Using
Console.WriteLine("Exited Reader Using")
End Sub