2010-03-31 6 views
3

J'ai un fichier Excel place sur le serveur. J'utilise une application écrite par VB.NET pour ouvrir un fichier en mode lecture seule.Vérifiez fichier Excel est ouvert par un autre utilisateur

Utilisateur 1 ouvrir le fichier en mode lecture seule. Comment l'utilisateur 2 peut-il détecter que le fichier est ouvert ou non?

Merci, Un

Répondre

1

Vous devez tester le fichier en lecture seule car ReadWrite échouera si le fichier est en lecture seule. Voici quelques méthodes. Je ne sais pas d'où je les ai tous, sauf le dernier par Randy Birch. Les tests de vitesse favorisent FileIsOpen3 et 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 
1

Le deuxième utilisateur peut essayer d'ouvrir le fichier en mode lecture-écriture pour savoir si le fichier est utilisé.

+2

Cela ne sonne pas optimal mais c'est vrai. Même si vous aviez un moyen de détecter le verrou, il est possible que, entre votre vérification de verrou et l'ouverture du fichier, quelqu'un puisse ouvrir le fichier, le mieux étant d'essayer d'ouvrir le fichier et d'attraper l'exception s'il y en a un. –

Questions connexes