获取从列表复制的文件的百分比

时间:2019-09-17 18:02:35

标签: vb.net progress-bar

我有一个应用程序,可以将列表中的文件复制到新目录。我正在尝试使进度条工作,但我的公式的结果为System.OverflowException:算术运算导致溢出。我看过其他使用文件复制的示例,但它们集中于使用源文件夹除以目标文件夹。挖矿有些不同,因为我使用的是列表中的文件。

谢谢您的帮助。

代码

        Dim progress = fileCount * 100 / fileList.Count()
        BackgroundWorker1.ReportProgress(progress)

获取文件计数的代码

Dim FILE_NAME As String

    FILE_NAME = txtFileName.Text
    Dim fileNames = System.IO.File.ReadAllLines(FILE_NAME)

    fCount = 0
    For i = 0 To fileNames.Count() - 1
        Dim fileName = fileNames(i)
        sFileToFind = location & "\" & fileName & "*.*"
        Dim paths = IO.Directory.GetFiles(location, fileName, IO.SearchOption.AllDirectories)
        If Not paths.Any() Then
            System.IO.File.AppendAllText(orphanedFiles, fileName & vbNewLine)
        Else
            For Each pathAndFileName As String In paths
                If System.IO.File.Exists(pathAndFileName) = True Then
                    sRegLast = pathAndFileName.Substring(pathAndFileName.LastIndexOf("\") + 1)
                    Dim toFileLoc = System.IO.Path.Combine(createXMLFldr, sRegLast)
                    Dim moveToFolder = System.IO.Path.Combine(MoveLocation, "XML files", sRegLast)

                    'if toFileLoc = XML file exists move it into the XML files folder
                    If System.IO.File.Exists(toFileLoc) = False Then
                        System.IO.File.Copy(pathAndFileName, moveToFolder)
                        System.IO.File.AppendAllText(ListofFiles, sRegLast & vbNewLine)
                        fCount = fCount + 1

                        XMLFilename = (sRegLast) + vbCrLf
                    End If
                End If
            Next
        End If

        Dim srcCount = paths.Count()
        If (paths.Count() = 0) Then
            srcCount = 1
        End If


        Dim progress = CType(fCount * 100 / srcCount, Integer)
        BackgroundWorker1.ReportProgress(progress)


    Next

2 个答案:

答案 0 :(得分:1)

这是我的最后修改:

    ListBox1.Items.Clear()
    Dim FILE_NAME As String

    FILE_NAME = "c:\YourFolder\YourFile.txt" 'can be changed
    Dim fileNames = System.IO.File.ReadAllLines(FILE_NAME)

    For Each MyFile In fileNames
        ListBox1.Items.Add(MyFile)
    Next

    Dim Location As String = "C:\YourFolder1" 'can be changed
    Dim moveToFolder As String = "C:\YourFolder2" 'can be changed
    Dim fCount As Integer = 0
    For Each fileName In fileNames

        Dim paths = IO.Directory.GetFiles(Location, fileName,
                                          IO.SearchOption.AllDirectories)

        If paths.Count > 0 Then
            Try
                System.IO.File.Copy(paths(0), fileName)
            Catch ex As Exception
            End Try
        End If
        fCount += 1
        Dim progress As Integer = Convert.ToInt32(fCount * 100 / fileNames.Count)
    Next

答案 1 :(得分:1)

对于BackGroundWorker,我希望这可以解决下次调用更新进度条的麻烦:

'This button1_click event to begin or stop async of backGrounedWorker
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    BackgroundWorker1.WorkerReportsProgress = True
    BackgroundWorker1.WorkerSupportsCancellation = True
    BackgroundWorker1.CancelAsync()
    Try
        BackgroundWorker1.RunWorkerAsync()
    Catch ex As Exception
    End Try
End Sub

'Here your backGroundProcess
Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    Dim FILE_NAME As String

    FILE_NAME = txtFileName.Text 'can be changed
    Dim fileNames = System.IO.File.ReadAllLines(FILE_NAME)

    Dim Location As String = "C:\MyData\Folder1" 'can be changed
    Dim moveToFolder As String = "C:\MyData\Folder2" 'can be changed
    Dim fCount As Integer = 0
    For Each fileName In fileNames

        Dim paths = IO.Directory.GetFiles(Location, fileName,
                                          IO.SearchOption.AllDirectories)

        If paths.Count > 0 Then
            Try
                System.IO.File.Copy(paths(0), moveToFolder & "\" & fileName, True)
            Catch ex As Exception
                Debug.Print(ex.Message)
            End Try
        End If
        For a = 1 To 100
            Debug.Print(a.ToString)
        Next

        'If any request pending process will be stop (when Button1_click happen while process running (BackGroundWorker in Action))
        If BackgroundWorker1.CancellationPending = True Then Exit For

        fCount += 1
        Dim Progress As Integer = Convert.ToInt32(fCount * 100 / fileNames.Count)
        BackgroundWorker1.ReportProgress(progress)
    Next
End Sub

'This will show you the progress in your progress bar
Private Sub bw1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    Me.ProgressBar1.Value = e.ProgressPercentage
End Sub

'Your Process Have Been Complete Here
Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    MessageBox.Show("Finish")
End Sub