Как создать индикатор выполнения, который обновляется одновременно с передачей файла - PullRequest
0 голосов
/ 05 апреля 2019

Как видно из названия, я пытаюсь создать индикатор выполнения, который обновляется при передаче файла.В настоящее время я использую Visual Studio 2019. Я просмотрел десятки статей и видео, все из которых утверждают, что именно это и делается.После многих дней тестирования я подошел близко, но индикатор выполнения все равно будет обновляться только после завершения передачи файла.Я использую многопоточность для достижения этой цели.Я был бы очень признателен, если бы кто-то мог просто изложить мне, как это сделать.Вот мой код до сих пор.На самом деле это не помогает, но вы можете хотя бы увидеть, чего я пытаюсь достичь.Я также пропустил несколько больших кусков закомментированного тестового сценария.

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

Imports System.ComponentModel
Imports System.Threading
Imports System
Imports System.IO

Public Class Form1
    Private Sub BtnStartTransfer_Click(sender As Object, e As EventArgs) Handles btnStartTransfer.Click
        BackgroundWorker1.RunWorkerAsync()
    End Sub

    Private Delegate Sub DelegateProgressBarMax(ByVal check As Integer)

    Private Sub ProgressBarUpdate(ByVal check As Integer)
        If pBar1.InvokeRequired = True Then
            Invoke(Sub() pBar1.Value = check)
        Else
            pBar1.Value = check
        End If
    End Sub

    Private Delegate Sub DelegateUpdateOutput(ByVal check2 As String)
    Private Sub OutputUpdate(ByVal check2 As String)
        If txtOutput.InvokeRequired = True Then
            Invoke(Sub() txtOutput.Text = txtOutput.Text & check2 & Environment.NewLine)
        Else
            txtOutput.Text = txtOutput.Text & check2
        End If
    End Sub

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim getCopyFrom As String = txtCopyFrom.Text
        Dim getCopyTo As String = txtCopyTo.Text

        Dim splitUser() As String = getCopyFrom.Split("\")
        Dim finalValue As String = splitUser.Length - 1
        Dim stringValue As String = CStr(splitUser(finalValue))
        Dim getUser As String

        'If MsgBox("Is this the correct user?: " & stringValue, vbYesNo + vbQuestion) = vbYes Then
        '    getUser = stringValue
        'Else
        '    getUser = InputBox("Enter in the correct Username")
        'End If

        Dim checkCopyFrom As New IO.DirectoryInfo(getCopyFrom)
        Dim checkCopyTo As New IO.DirectoryInfo(getCopyTo)

        If checkCopyFrom.Exists Then

        Else
            MsgBox("The location you are trying to copy from does not exist.")
            Exit Sub
        End If

        If checkCopyTo.Exists Then

        Else
            MsgBox("The location you are trying to copy to does not exist.")
            Exit Sub
        End If

        'Copying the Desktop folder
        Dim dirDesktop = getCopyFrom & "\Desktop"
        Dim getDir = IO.Directory.GetFiles(dirDesktop, "*", IO.SearchOption.AllDirectories)
        Dim fileTotal As Integer = getDir.Length
        Dim filesTransferred As Integer = 0

        Dim di As New DirectoryInfo(dirDesktop)
        Dim fiArr As FileInfo() = di.GetFiles("*", SearchOption.AllDirectories)
        Dim diArr As DirectoryInfo() = di.GetDirectories("*", IO.SearchOption.AllDirectories)
        Dim fri As FileInfo
        Dim fol As DirectoryInfo

        For Each fri In fiArr
            filesTransferred += 1
            BackgroundWorker1.ReportProgress(CInt(filesTransferred * 100 \ fiArr.Length), True)
            OutputUpdate(fri.Name)
            'File.Copy(dirDesktop & "\" & fri.Name, getCopyTo & "\" & fri.Name, True)
            'My.Computer.FileSystem.CopyDirectory(getCopyFrom & "\Desktop", getCopyTo & "\Users\" & getUser & "\Desktop", False)
        Next fri
End Sub

    Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        pBar1.Value = e.ProgressPercentage
    End Sub
...