Почему использование Filestream для быстрого копирования файла с большой задержкой до его завершения? - PullRequest
0 голосов
/ 11 июня 2019

Я использую пару файлов 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
...