2010-03-31 4 views
3

У меня есть файл с файлом excel на сервере.Проверьте, что файл excel открыт другим пользователем

Я использую приложение, написанное VB.NET для открытия файла в режиме только для чтения.

Пользователь 1 открыть файл в режиме только для чтения. Как пользователь может обнаружить, что файл открыт или нет?

Спасибо,

ответ

1

Вам необходимо протестировать файл только для чтения, поскольку ReadWrite завершится с ошибкой, если файл имеет статус ReadOnly. Ниже приведены некоторые методы. Не знаю, где я их всех, кроме последнего, Рэнди Берч. Тесты скорости помогают 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 
1

Второй пользователь может попытаться открыть файл в режиме чтения-записи, чтобы знать, если файл используется.

+2

Не кажется оптимальным, но его истинным. Даже если у вас есть какой-то способ обнаружить блокировку, что между проверкой блокировки и фактическим открытием файла кто-то может открыть файл, поэтому лучше всего просто попытаться открыть файл и поймать исключение, если оно есть. –

Смежные вопросы