【问题标题】:Setting A Progress Bar Based On Directory Copy in Visual Basic在 Visual Basic 中基于目录副本设置进度条
【发布时间】:2014-03-10 15:04:47
【问题描述】:

我正在使用 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

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

【问题讨论】:

  • 听起来你已经很清楚了。正如你所说,找出源文件夹的大小,然后定期检查目标文件夹。它的大小除以源文件夹大小将是您的进度%。
  • 我应该使用定时器来检查,还是有其他方法?

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


【解决方案1】:

您可以计算源目录中的文件,然后每隔一段时间计算目标目录中的文件。要计算所有子目录中的文件,您可以使用递归子目录:

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 As Timer
Private Sub StartCopy(SourceFolder As String, DestFolder As String)
    'copy copy copy
    CopyComplete()
End Sub
Private Sub CopyComplete()
    tmrUpdatePBG.Stop()
End Sub

[...]
'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 将是计时器。在滴答事件中更新进度条。它在复制过程开始时启动,在复制过程完成时停止。

【讨论】:

    【解决方案2】:

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

    我的进度条也有问题(没有响应),所以我将 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多