Как определить, что файл использовался другим процессом или нет? - PullRequest
1 голос
/ 06 декабря 2011

Я хотел сохранить данные в ячейках Excel, но это не получится, если файл Excel будет открыт другим процессом, так как определить, что файл использовался другим процессом или нет, прежде чем записывать в него данные?

Спасибо

Ответы [ 2 ]

2 голосов
/ 06 декабря 2011

MS имеет хороший пример того, как проверить, можно ли получить доступ к файлу, или нет, прежде чем пытаться открыть его, используя функцию, которую они написали под названием FileLocked.

Sub YourMacro()
   Dim strFileName As String
   ' Full path and name of file.
   strFileName = "C:\test.doc"
   ' Call function to test file lock.
   If Not FileLocked(strFileName) Then
      ' If the function returns False, open the document.
      Documents.Open strFileName
   End If
End Sub

А вот функция (какнаписанный MS):

Function FileLocked(strFileName As String) As Boolean
   On Error Resume Next
   ' If the file is already opened by another process,
   ' and the specified type of access is not allowed,
   ' the Open operation fails and an error occurs.
   Open strFileName For Binary Access Read Write Lock Read Write As #1
   Close #1
   ' If an error occurs, the document is currently open.
   If Err.Number <> 0 Then
      ' Display the error number and description.
      MsgBox "Error #" & Str(Err.Number) & " - " & Err.Description
      FileLocked = True
      Err.Clear
   End If
End Function

Справка от Microsoft: http://support.microsoft.com/kb/209189

0 голосов
/ 06 декабря 2011

Исходя из ответа Иссуна, если вы обнаружите, что функция Microsoft FileLocked не работает (например, я обнаружил, что она будет неправильно утверждать, что записываемые в данный момент файлы WTV не заблокированы), тогда вы можете использовать этот метод, который немного более жесток:

Function FileLocked(sFilename) As Boolean
    Dim oFile, sNewFile, iCount
    If fso.FileExists(sFilename) = False Then
        FileLocked = False
        Exit Function
    End If
    ' Pick a random, unused, temp name
    iCount = 0
    Do
        sNewFile = sFilename & ".tmp" & iCount
        iCount = iCount + 1
    Loop Until fso.FileExists(sNewFile) = False
    ' Try to rename it to that. If it fails, then it is in use
    On Error Resume Next
    fso.MoveFile sFilename, sNewFile
    If Err.Number = 0 Then
        ' It moved okay, so rename it back
        fso.MoveFile sNewFile, sFilename
        FileLocked = False
    Else
        FileLocked = True
    End If
    On Error Goto 0     
End Function
...