【问题标题】:Smooth progress bar while copying folders VB.NET复制文件夹时平滑进度条 VB.NET
【发布时间】:2016-02-02 08:54:42
【问题描述】:

我正在制作一个将子文件夹复制到另一个文件夹的程序,但我的进度条无法正常工作,例如当我复制单个子文件夹时,它的百分比仅为 20% 并停在那里,但如果它是 2 个子文件夹50%就停了,加载进度就像捷径一样不流畅。

你们能帮帮我吗?

更新

这是我的代码:

Dim foldersToCopy As New ArrayList()

Sub CopyFolders()

Dim foldsrc As DirectoryInfo = New DirectoryInfo(src)

    For Each folders In foldsrc.GetDirectories
        If Not System.IO.Directory.Exists(dest & "\" & folders.Name) Then
            foldersToCopy.Add(folders.Name)
        End If
    Next

    Dim src As String = Form2.TextBox1.Text
    Dim dest As String = Form2.TextBox2.Text

    Dim fcount = Directory.GetDirectories(src).Length
    Dim ftransfer As Integer = 0
    For i = 0 To foldersToCopy.Count - 1
            My.Computer.FileSystem.CopyDirectory(src & "\" & foldersToCopy(i), dest & "\" & foldersToCopy(i), True)
            ftransfer += 1
            Pbar1.value += ftransfer * 50 / fcount
            Pbar1.Update()
    Next
End Sub

顺便说一句,我可以将WebCliente.ProgressPercentageDownloadProgressChanged 用于此代码以获得平滑的进度条吗? =)

【问题讨论】:

  • 这看起来不对。尝试使用以下代码更新进度条:Pbar1.value = (ftransfer * 100) / fcount
  • 你可能应该将fcount 设置为:Dim fcount As Integer = foldersToCopy.Count,因为你想要所有子目录对吗?不只是当前文件夹中的那些?
  • 还是一样,没有任何改变。 =(

标签: .net vb.net loops directory progress-bar


【解决方案1】:

ProgressBar 值从 0 变为 100 (%),因此您必须缩放循环中的数字以计算出您已完成的百分比:

For i = 0 To foldersToCopy.Count - 1
    'copy the folder here
    Dim percentage = CSng(100 / foldersToCopy.Count * (i + 1))
    Pbar1.value = percentage
Next

【讨论】:

  • 它不起作用,当我尝试复制 1 个文件夹时,百分比会跳跃并停止在 50%,但是如果 2 个文件夹它会突然跳跃到 100%。
  • My.Computer.FileSystem.CopyDirectory 不会报告它自己的进度,因此您只能在每次复制整个目录时执行步骤。您可以逐个文件复制,这会给您更多的步骤和更小的增量
【解决方案2】:

确定一些更改。我已将您的文件夹复制声明移动到子目录中。 还添加了一行来将 Pbar1.maximum 设置为要复制的文件夹数减一,以便循环的最后一个循环,进度条将在最后,您不必费心重新计算如何获取 0 和之间的值100. 也

Sub CopyFolders()

Dim foldersToCopy As New ArrayList()
Dim foldsrc As DirectoryInfo = New DirectoryInfo(src)

    For Each folders In foldsrc.GetDirectories
        If Not System.IO.Directory.Exists(dest & "\" & folders.Name) Then
            foldersToCopy.Add(folders.Name)
        End If
    Next

    Dim src As String = Form2.TextBox1.Text
    Dim dest As String = Form2.TextBox2.Text

    Dim fcount = Directory.GetDirectories(src).Length
    Dim ftransfer As Integer = 0
    Pbar1.Maximum=fcount
    For i = 0 To foldersToCopy.Count - 1
            My.Computer.FileSystem.CopyDirectory(src & "\" & foldersToCopy(i), dest & "\" & foldersToCopy(i), True)
            Pbar1.value += 1
            Pbar1.Update()
    Next
End Sub

告诉我

【讨论】:

  • 但我需要进度条而不是那个。 =(
  • 真正让它顺利进行的唯一方法不是复制目录,而是创建一个所有文件的列表并复制它们。将 Pbar1.Maximum 设置为要复制的文件数,对于复制的每个文件,将 Pbar1.Value 加 1。
  • 偶尔 - 如果您正在执行耗时的操作(例如锁定主 UI 的目录副本),进度条通常会很不稳定。您可以尝试在循环的每个循环上强制 Pbar1.refresh,但这会在一定程度上影响循环的性能。
  • 我正在测试要复制的 1 和 2 个文件夹。
  • 我更新了我的代码,我所做的就是把所有的文件夹放到一个arraylist中,然后把它全部复制出来,对吗?
猜你喜欢
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多