检查excel文件已被其他用户打开

时间:2010-03-31 04:49:08

标签: vb.net

我在服务器上有一个excel文件位置。

我正在使用VB.NET编写的应用程序以只读模式打开文件。

用户1以只读模式打开文件。 用户2如何检测该文件是否处于打开状态?

谢谢, 一个

2 个答案:

答案 0 :(得分:1)

第二个用户可以尝试以读写模式打开文件,以了解文件是否正在使用。

答案 1 :(得分:1)

如果文件是ReadOnly状态,则需要测试文件只读,因为ReadWrite将失败。 以下是一些方法。不知道除了Randy Birch的最后一个,我从哪里得到了它们。 速度测试支持FileIsOpen3和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