在Visual Basic中基于目录复制设置进度条

时间:2014-03-10 15:04:48

标签: vb.net progress-bar vb.net-2010

我正在使用Visual Studio 2010并在Visual Basic中进行编码。

我必须在复制目录时显示进度条。 我以前从未使用过进度条,也不知道从哪里开始。 这是我目前的代码。

If My.Computer.FileSystem.DirectoryExists(filePath & "IETMS\" & installFile) Then
    frmWait.Show()

    My.Computer.FileSystem.CopyDirectory(strFileName, filePath & "IETMS", True)

    ListView1.Items.Clear()
    testReload()
    frmWait.Close()
Else
    My.Computer.FileSystem.CreateDirectory(filePath & "IETMS\" & installFile)

    frmWait.Show()

    My.Computer.FileSystem.CopyDirectory(strFileName, filePath & "IETMS", True)

    ListView1.Items.Clear()
    testReload()
    frmWait.Close()
 End If

我假设我需要计算源文件夹的大小,然后监视目标文件夹大小并将进度条最大值设置为源文件夹大小,并将进度条的值设置为目标大小,但我我不知道该怎么做。

2 个答案:

答案 0 :(得分:3)

您可以计算源目录中的文件,然后经常计算目标目录中的文件。要计算所有子目录中的文件,可以使用递归子:

Private Sub CountFiles(InFolder As String, ByRef Result As Integer)
    Result += IO.Directory.GetFiles(InFolder).Count
    For Each f As String In IO.Directory.GetDirectories(InFolder)
        CountFiles(f, Result)
    Next
End Sub

要使用此功能

Dim FileCount as Integer = 0
CountFiles("C:\test", FileCount)
Messagebox.Show(FileCount.ToString)

将进度条设置为百分比值,如pbProgress.Value = CInt(DestCount/SourceCount * 100)

编辑:跟进您的问题:您应该使用例如后台工作者,任务或线程来执行复制,然后更新计时器中的进度条。 例如,您可以创建一个执行复制的子,然后在新任务中启动子:     Private WithEvents tmrUpdatePBG作为计时器     Private Sub StartCopy(SourceFolder As String,DestFolder As String)         '复制副本         CopyComplete()     结束子     Private Sub CopyComplete()         tmrUpdatePBG.Stop()     结束子

[...]
'Whereever you start the copy process
Dim ct As New Task(Sub() StartCopy("C:\source", "C:\dest"))
ct.Start()
tmrUpdatePBG = New Timer
tmrUpdatePBG.Interval = 1000
tmrUpdatePBG.Start()

tmrUpdatePGB将成为计时器。在tick事件中更新进度条。它在复制过程开始时启动,在过程完成时停止。

答案 1 :(得分:0)

我最终计算了源文件夹中的文件并将进度条max设置为该数字。然后在计时器内部计算目标文件夹中的文件,并将进度条值设置为该数字。然后在复制完成后关闭我使用进度条创建的窗口。

我的进度条也有问题(没有响应)所以我将CopyDirectory放在BackgroundWorker中。

Private Sub tmrWait_Tick(sender As System.Object, e As System.EventArgs) Handles tmrWait.Tick

        Dim srcFile As String = strFileName & "\" & installFile
        Dim srcDir As New System.IO.DirectoryInfo(srcFile)
        Dim srcFolders, srcFiles As Integer
        srcFolders = srcDir.GetDirectories.GetUpperBound(0) + 1
        srcFiles = srcDir.GetFiles.GetUpperBound(0) + 1
        pbInstall.Maximum = srcFolders.ToString()

        Dim desFile As String = filePath & "IETMS\" & installFile & "\" & installFile
        Dim desDir As New System.IO.DirectoryInfo(desFile)
        Dim desFolders, desFiles As Integer
        desFolders = desDir.GetDirectories.GetUpperBound(0) + 1
        desFiles = desDir.GetFiles.GetUpperBound(0) + 1
        pbInstall.Value = desFolders.ToString()

        pbInstall.Refresh()

    End Sub

    Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

        System.Threading.Thread.Sleep(1000)
        My.Computer.FileSystem.CopyDirectory(strFileName, filePath & "IETMS\" & installFile, True)

    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted

        frmMain.ListView1.Items.Clear()
        frmMain.testReload()
        Me.Close()

    End Sub

    Private Sub frmWait_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        BackgroundWorker1.RunWorkerAsync()

    End Sub