VB.Net 3.5 Check if file is in use

ErocM picture ErocM · Jul 3, 2009 · Viewed 35.6k times · Source

I have an update program that is completely independent of my main application. I run the update.exe to update the app.exe. To check to see if the file is in use, I move it to another file and catch an error if it is in use. If no problems occurr I rename it back. At least that was my plan...

Main program: app.exe
Update program: update.exe

This program is used over the network without any services running. So, the users is quite literally running the exe over the network on thier machine.

I need to update the app.exe when the update.exe has run. To check to see if the app.exe was still in use I was wrapping the following in a try/catch to see if it failed:

IO.File.Move(upddir & "\app.exe", upddir & "\app.exe.tst")
IO.File.Move(upddir & "\app.exe.tst", upddir & "\app.exe")

The funny thing is, even if the app.exe is running, the move can rename it to the app.exe.tst without any error. I can even continue on in the application without any errors.

I thought I was out of my mind, so I had another programmer look at this and he verified what I said above.

So, we tried this wrapped in a try catch:

Dim readfile As New FileStream(upddir & "\app.exe", FileMode.Open, FileAccess.Read, FileShare.None)
readfile.Dispose()

I put the fileshare as none that, at least I thought it would, show that there was someone in the file.

It still continued without any error.

Anyone know why I can rename a file in use? Also, is there a better way to do this than what I am doing now?

Thanks! Eroc

Answer

Manuel Alves picture Manuel Alves · Mar 21, 2011

The same code using "using" :)

Public Function FileInUse(ByVal sFile As String) As Boolean
 Dim thisFileInUse As Boolean = False
 If System.IO.File.Exists(sFile) Then
     Try
       Using f As New IO.FileStream(sFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None)
                ' thisFileInUse = False
       End Using
     Catch
       thisFileInUse = True
     End Try
 End If
 Return thisFileInUse
End Function