Check excel file opened by another user

I have an excel file on the server.

I am using an application written by VB.NET to open a file in read-only mode.

User 1 open the file in read-only mode. How can user 2 detect that a file is open or not?

Thank,

+3
source share
2 answers

You need to test the file as read-only, because ReadWrite will fail if the file has ReadOnly status. Below are some methods. I don’t know where I am all of them, except the last, Randy Burch. Speed ​​tests help FileIsOpen3 and FileIsOpen4.

Function FileIsOpen1(ByVal pathfile As String) As Boolean
    Dim ff As Integer
    If System.IO.File.Exists(pathfile) Then
        Try
            ff = FreeFile()
            Microsoft.VisualBasic.FileOpen(ff, pathfile, OpenMode.Binary, OpenAccess.Read, OpenShare.LockReadWrite)
            Return False
        Catch
            Return True
        Finally
            FileClose(ff)
        End Try
        Return True
    End If
End Function

Function FileIsOpen2(ByVal pathfile As String) As Boolean
    Dim stream As FileStream = Nothing
    Dim fi As FileInfo = Nothing
    If System.IO.File.Exists(pathfile) Then
        Try
            fi = New System.IO.FileInfo(pathfile)
            stream = fi.Open(FileMode.Open, FileAccess.Read, FileShare.None)
            Return True
        Catch generatedExceptionName As IOException
            Return False
        Finally
            If stream IsNot Nothing Then
                stream.Close()
            End If
            fi = Nothing
        End Try
        Return True
    End If
End Function

Private Function FileIsOpen3(ByVal pathfile As String) As Boolean
    Try
        Dim fs As IO.FileStream = IO.File.Open(pathfile, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.None)
        fs.Close()
        fs.Dispose()
        fs = Nothing
        Return False
    Catch ex As IO.IOException ' File open
        Return True
    Catch ex As Exception ' Unknown error
        Return True
    End Try
End Function

Private Declare Function CreateFile Lib "kernel32" _
   Alias "CreateFileA" _
  (ByVal lpFileName As String, _
   ByVal dwDesiredAccess As Long, _
   ByVal dwShareMode As Long, _
   ByVal lpSecurityAttributes As Long, _
   ByVal dwCreationDisposition As Long, _
   ByVal dwFlagsAndAttributes As Long, _
   ByVal hTemplateFile As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" _
  (ByVal hFile As Long) As Long

' Method
Shared Function FileIsOpen4(ByVal pathfile As String) As Boolean
    ' Is File In Use Β©1996-2009 Randy Birch
    ' http://vbnet.mvps.org/index.html?code/fileapi/createfile_inuse.htm
    Const GENERIC_READ As Long = &H80000000
    Const INVALID_HANDLE_VALUE As Long = -1
    Const OPEN_EXISTING As Long = 3
    Const FILE_ATTRIBUTE_NORMAL As Long = &H80
    Dim hFile As Long

    If System.IO.File.Exists(pathfile) Then
        Try
            ' note that FILE_ATTRIBUTE_NORMAL (&H80) has a different value than VB constant vbNormal (0)!
            hFile = CreateFile(pathfile, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0&)
            ' this will evaluate to either -1 (File in use) or 0 (File free)
            Return hFile = INVALID_HANDLE_VALUE
        Catch ex As Exception
            MessageBox.Show(ex.ToString)
        Finally
            CloseHandle(hFile)
        End Try
    Else
        Return True
    End If
End Function
+1
source

The second user may try to open the file in read-write mode to find out if the file is being used.

+1

Source: https://habr.com/ru/post/1739254/


All Articles