繁体   English   中英

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

[英]Check excel file is open by other user

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

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

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

谢谢,安

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

您需要测试文件只读,因为如果文件是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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM