копировать файлы каталогов с помощью индикатора выполнения - PullRequest
0 голосов
/ 25 апреля 2018

Попытка создать консольное приложение для копирования каталогов из источника в место назначения, и либо индикатор выполнения ничего не делает во время копирования файлов ...

My.Computer.FileSystem.CopyDirectory(source, destination)

For i = 1 To 100
 Console.Write(String.Format("Copy progress: {0}%" & vbCr, i))
 Threading.Thread.Sleep(100)
Next

или индикатор выполнения показывает «Копировать прогресс 1%» в течение всего времени копирования ...

For i = 1 To 100
 Console.Write(String.Format("Copy progress: {0}%" & vbCr, i))
 My.Computer.FileSystem.CopyDirectory(source, destination)
 Threading.Thread.Sleep(100)
Next

Интересно, что я делаю неправильно, потому что я явно помещаю строку My.Computer в неправильное место!

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Вы можете вызвать встроенную индикатор выполнения Windows при копировании с помощью UIOption.AllDialogs:

My.Computer.FileSystem.CopyFile("C:\text.txt", "C:\my_folder\text.txt", FileIO.UIOption.AllDialogs, FileIO.UICancelOption.DoNothing)
0 голосов
/ 25 апреля 2018

Простое решение, использующее Linq Select для копирования списка файлов, возвращаемого DirectoryInfo.GetFiles ()

Передача примера метода массива исходных каталогов иКаталог назначения.
Ход выполнения (0-100%) выводится в окне «Вывод», а индикатор выполнения отображает визуальную информацию о состоянии копирования для каждого исходного пути.

Этот метод будетвернуть список всех скопированных файлов.

enter image description here

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: более быстрый перечислитель каталогов

...