Andrew Mickelson
Andrew Mickelson

Reputation: 5

Incorrect progressbar value reported by the backgroundworker

I build an app, which searches for different files through the computer, including Windows, ProgramFiles, etc folders.

The problem is that, for some odd reason, the application does not correctly report the progressbar value accordingly to the progress made in searching the files. This means that, the file search continues, BUT the progressbar is already 100%. The progressbar value SHOULD be 100% when the file search has been successfully completed.

====other code is already here ====

  Dim int As Integer = 0
Dim filecount As Integer = 0

Private Function GetFilesRecursive(ByVal path As String) As List(Of String)
    Dim lstResult As New List(Of String)
    Dim stkStack As New Stack(Of String)
    stkStack.Push(path)
    Do While (stkStack.Count > 0)
        Dim strDirectory As String = stkStack.Pop
        Try
            lstResult.AddRange(Directory.GetFiles(strDirectory, "*.*"))
            Dim strDirectoryName As String
            For Each strDirectoryName In Directory.GetDirectories(strDirectory)
                stkStack.Push(strDirectoryName)
            Next
        Catch ex As Exception
        End Try
    Loop
    Return lstResult
End Function
Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles Quickscan.DoWork
   
     Try
       
        Dim i As Integer 
        Dim files As List(Of String) = GetFilesRecursive(FolderBrowserDialog1.SelectedPath)
        For Each file As String In files
            
            Try
                Dim scanbox As New TextBox
                Dim read As String = My.Computer.FileSystem.ReadAllText(System.AppDomain.CurrentDomain.BaseDirectory & "db1.db")
                scanbox.Text = read.ToString
                Dim md5 As MD5CryptoServiceProvider = New MD5CryptoServiceProvider
                Dim f As FileStream = New FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read, 8192)
                f = New FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read, 8192)
                md5.ComputeHash(f)
                Dim hash As Byte() = md5.Hash
                Dim buff As StringBuilder = New StringBuilder
                Dim hashByte As Byte
                For Each hashByte In hash
                    buff.Append(String.Format("{0:X2}", hashByte))
                Next

                If scanbox.Text.Contains(buff.ToString) Then
                    AddListItem(Listbox2, "" & file)
                    AddListItem2(Listbox2, "" & file & "")
                End If
            Catch ex As Exception
            End Try
           
            If (Backgroundworker1.CancellationPending = True) Then

                e.Cancel = True
                Exit For
            End If
            SetLabelText_ThreadSafe(Me.Labelscannedfiles, file & "")
            i = i + 1 
            SetLabelText_ThreadSafe(Me.Label2, i)
            Dim pct As Integer = CInt(CDbl(i) / CDbl(files.Count) * 100)
            Backgroundworker1.ReportProgress(pct)
        Next file
    Catch ex As UnauthorizedAccessException
    End Try

  Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles Backgroundworker1.ProgressChanged
   
    Label28.Text = "Computer scan is in progress... Please wait"
    ProgressBar1.Value = e.ProgressPercentage / 100  

Any solution or help would be highly appreciated!

Upvotes: 0

Views: 43

Answers (1)

Idle_Mind
Idle_Mind

Reputation: 39152

In your DoWork() method...

Change:

For Each file As String In GetFilesRecursive(FolderBrowserDialog1.SelectedPath)

To:

Dim i As Integer ' <- you didn't actually declare a counter before
Dim files As List(Of String) = GetFilesRecursive(FolderBrowserDialog1.SelectedPath)
For Each file As String In files

Now you can get the count from "files" and use that in your percentage calculation:

i = i + 1 ' <-- increment our "i" counter
SetLabelText_ThreadSafe(Me.Label2, i)
Dim pct As Integer = CInt(CDbl(i) / CDbl(files.Count) * 100)
backgroundworker1.ReportProgress(pct)

Upvotes: 1

Related Questions