Search code examples
vb.netfile-exists

Can't get checking if file exists using textboxes to work


I've been racking my brain for days over this code and I just can't seem to get it working. I've researched and researched with no luck. I have four textboxes on my form. Two textboxes is a folder location and the other two textboxes are file locations. I'm trying to use a function that will return true or false telling if the files in the two textboxes exist or not. I don't see anything at all wrong with this code and it just won't work! I'm sure it's something simple I'm overlooking. Maybe someone else can spot it!

Private Function doesFileExist(folderPath, fileName) As Boolean
    If IO.File.Exists(folderPath & "\" & fileName) Then
        Return True
    Else
        Return False
    End If
End Function

Private Sub chkStart_CheckedChanged(sender As Object, e As EventArgs) Handles chkStart.CheckedChanged
    If doesFileExist(txtCPU.Text, txtFileCPU.Text) And
        doesFileExist(txtGPU.Text, txtFileGPU.Text) Then
        If chkStart.Checked Then
            chkStart.Text = "Stop Monitor"
        Else
            chkStart.Checked = False
            chkStart.Text = "Start Monitor"
        End If
    Else
        chkStart.Checked = False
        MessageBox.Show("Please check directory & file locations!", "Error!", MessageBoxButtons.OK)
        End if
End Sub

I want to mention that before I tried nested if statements on this I also tried to separate them both like so..

Private Sub chkStart_CheckedChanged(sender As Object, e As EventArgs) Handles chkStart.CheckedChanged
    If Not doesFileExist(txtCPU.Text, txtFileCPU.Text) And
       Not doesFileExist(txtGPU.Text, txtFileGPU.Text) Then
        chkStart.Checked = False
        MessageBox.Show("Please check directory & file locations!", "Error!", MessageBoxButtons.OK)
        Exit Sub
    End If

    If chkStart.Checked Then
        chkStart.Text = "Stop Monitor"
    Else
        chkStart.Checked = False
        chkStart.Text = "Start Monitor"
    End If
End Sub

Both of these ways will show the messagebox if the application is ran with the checkbox checked on start up. Not only will it show the messagebox it also shows the messagebox twice! I've yet to figure that one out!


Solution

  • Your check file exists can be simplified... (It's been a while since I used VB so apologies for any syntax errors, I don't have an IDE to hand)

    Function DoesFileExist(Folder as String, Filename As String) As Boolean
        Return IO.File.Exists(IO.Path.Combine(Folder, Filename))
    End Function
    

    Re: Changing whether the "check" checkbox is set shouldn't perform the check itself - otherwise you only check when people click. (Incidentally, I'm guessing you're getting a message twice as code elsewhere ticks/unticks this checkbox, but it's only a guess).

    Private Sub chkStart_CheckedChanged(sender As Object, e As EventArgs) Handles chkStart.CheckedChanged
        If chkStart.Checked Then
            chkStart.Text = "Stop Monitor"
            PollTimer.Start()
        Else
            chkStart.Text = "Start Monitor"
            PollTimer.Stop()
        End if
    End Sub
    

    Finally... You need to define when your check will happen. Ideally, you'd want to use a FileSystemWatcher which will give you events when the file system changes, but you can also poll using a timer...

    Private PollTimer As System.Timers.Timer
    

    Then in your Form Main, do some initial timer setup...

    ...
    PollTimer = New System.Timers.Timer()
    PollTimer.Interval = 30000 ' Seconds
    AddHandler PollTimer.Elapsed, AddressOf CheckExistsNow
    PollTimer.Start()
    ...
    

    And finally the code to run every time we want to make the check....

    Sub CheckExistsNow(sender As Object, e As System.Timers.ElapsedEventArgs)
        If Not DoesFileExist(txtGPU.Text, txtFileGPU.Text) Then
            ' Handle the missing file.
        End if
    End Sub