VB.Net 3.5 Check if file is in use

后端 未结 5 1645
甜味超标
甜味超标 2021-01-15 03:43

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

相关标签:
5条回答
  • 2021-01-15 04:01

    What you could do is replace the target application with a caretaker exe.

    This caretaker then spawns the target application, but also creates a locked file in a shared location. The lock is released and the file is deleted when the app exits.

    Then, before you update the app.exe, you check are there any locked files in the shared location, if there are locked files then the app.exe is in use.

    The caretaker program could be a window-less application, the following console app does pretty much what it needs to do

    class Program
    {
        static string lockFileName;
        static System.IO.StreamWriter lockFileWrtier;
        static void Main(string[] args)
        {
            lockFileName = "AppLock_" + System.IO.Path.GetRandomFileName();
    
            lockFileWrtier = new System.IO.StreamWriter(lockFileName);
    
            System.Diagnostics.Process p = new Process();
            p.StartInfo.FileName = "cmd.exe";
            p.EnableRaisingEvents = true;
            p.Exited += new EventHandler(p_Exited);
    
            p.Start();
    
            Console.WriteLine("Press any key to stop");
            Console.ReadKey();
        }
    
        static void p_Exited(object sender, EventArgs e)
        {
            lockFileWrtier.Dispose();
            System.IO.File.Delete(lockFileName);
    
            Console.WriteLine("Process has exited");
        }
    }
    

    The updater then looks for all "AppLock_*" files, and attempts to open them with a write lock, if it can't get a write lock on one of them, the exe is in use.

    Hope this helps.

    0 讨论(0)
  • 2021-01-15 04:02

    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
    
    0 讨论(0)
  • 2021-01-15 04:07

    This is what I ended up doing. The network scan did not work on a peer-to-peer network. It didn't resolve the other computers at all.

    Anyhow, here it is:

    Private Sub CheckFileIfFileIsInUse(ByVal thefilename As String)
    Try
    ' on the Vista OS you can rename a file that is in use
    ' the 'in use' of the original file follows the new file name

          Dim testfile As String = thefilename & ".tst"<br />
    
          If IO.File.Exists(testfile) Then<br />
              IO.File.Delete(testfile)<br />
          End If<br />
    
          ' so we have to rename it to something else<br />
          IO.File.Move(thefilename, testfile)<br />
    
          ' copy it back to the original file name in case something <br />breaks 
          ' this just keeps them in working order if it does<br />
          IO.File.Copy(testfile, thefilename)<br />
    
          ' then we try to delete the original file that could be in use <br />
          ' which will return an 'in use' error at this point<br />
          If IO.File.Exists(testfile) Then<br />
              IO.File.Delete(testfile)<br />
          End If<br />
    
      Catch ex As Exception<br />
          'throw it to the originating method<br />
          Throw<br />
      End Try<br />
    

    End Sub

    Hope this helps the next person.

    0 讨论(0)
  • 2021-01-15 04:16

    You could do the following to check if the application has other instances running:

    Process.GetProcessesByName("app.exe", "Machine1").Length > 0
    

    Which is a more appropriate way of checking if the app is running.

    Have a look at File.Move MSDN documentation. It details what exceptions are thrown. You are allowed to rename an exe even if it is in Use in Vista.

    0 讨论(0)
  • 2021-01-15 04:16
    Public Function FileInUse(ByVal sFile As String) As Boolean
        If System.IO.File.Exists(sFile) Then
            Try
                Dim F As Short = FreeFile()
                FileOpen(F, sFile, OpenMode.Binary, OpenAccess.ReadWrite, OpenShare.LockReadWrite)
                FileClose(F)
            Catch
                Return True
            End Try
        End If
    End Function
    
    0 讨论(0)
提交回复
热议问题