Простое решение, использующее Linq Select
для копирования списка файлов, возвращаемого DirectoryInfo.GetFiles ()
Передача примера метода массива исходных каталогов иКаталог назначения.
Ход выполнения (0-100%) выводится в окне «Вывод», а индикатор выполнения отображает визуальную информацию о состоянии копирования для каждого исходного пути.
Этот метод будетвернуть список всех скопированных файлов.
![enter image description here](https://i.stack.imgur.com/nxmNK.gif)
Dim SourcePath As String() = New String() {"[SourcePath1]", "[SourcePath2]", "[SourcePath3]"}
Dim DestinationPath As String = "[DestinationPath]"
Dim FilesCopied As List(Of String) = CopyDirectoryWithProgress(SourcePath, DestinationPath)
Console.ReadLine()
Private Function CopyDirectoryWithProgress(SourcePath() As String, DestPath As String) As List(Of String)
Dim AllFilesCopied As List(Of String) = New List(Of String)
Dim ProgressBarPassSymbol As Char = ChrW(&H25A0)
Dim ProgressBarEmptySymbol As String = New String(ChrW(&H2014), 30)
For Each sPath As String In SourcePath
Dim DirInfo As New DirectoryInfo(sPath)
Dim NumberOfFiles As Integer = Directory.EnumerateFiles(sPath).Count()
Dim ProgressBarPass As Double = (30 / NumberOfFiles)
Dim Increment As Double = 100 / NumberOfFiles
Directory.CreateDirectory(DestPath)
Console.CursorLeft = 0
Console.Write("Copy progress: ")
Console.CursorLeft = 20
Console.Write(ProgressBarEmptySymbol)
AllFilesCopied.AddRange(DirInfo.
GetFiles().
Select(Function(f, i)
File.Copy(Path.Combine(sPath, f.Name), Path.Combine(DestPath, f.Name), True)
Console.CursorLeft = 15
Console.Write("{0:g}% " &
New String(ProgressBarPassSymbol, CInt((i + 1) * ProgressBarPass)),
CInt((i + 1) * Increment))
Return f.FullName
End Function))
Console.WriteLine()
Next
Return AllFilesCopied
End Function
Для метода, который позволяет выполнять эту задачу намного быстрееперечислитель файлов, см. эту статью CodeProject: более быстрый перечислитель каталогов