收录日期:2021/01/28 15:23:33 时间:2010-03-31 04:49:08 标签:vb.net

I have a excel file place on server.

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

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

Thanks, An

You need to test the file Read Only as ReadWrite will fail if the file is ReadOnly status. Below are some methods. Not sure where I got them all from except the last one by Randy Birch. Speed tests favour 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's 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

The second user can try to open the file in read-write mode to know if the file is being used.