简体   繁体   中英

VBA Script to check if text file is open or not

I am checking if a file is open or not that is a .txt file

Private Sub CommandButton1_Click()
   Dim strFileName As String
   ' Full path and name of file.
   strFileName = "D:\te.txt"
   ' Call function to test file lock.
   If Not FileLocked(strFileName) Then
   ' If the function returns False, open the document.
      MsgBox "not open"
   Else
      MsgBox "open"
   End If

End Sub

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

It turns out .txt when opened using notepad doesn't lock the file, so it can not be known if a .txt file is open or not. And hence, if that .txt file is opened in Wordpad or Sakura, etc., your code should work or at least other code from the net should work.

I found that if a text file is opened using FileSystemObject, then the file is not locked and can still be edited by other users. As a potential workaround, you could make a file with a single bit to indicate when the other file is in use, and include checking that bit in your code. Here's my code as a rough example:

'FSO parameters
Const ForAppending = 8
Const ForReading = 1
Const ForWriting = 2

Sub WriteToFile()
    Set fso = CreateObject("Scripting.FileSystemObject")

    'Check the current lock bit (1 is locked, 0 is unlocked)
    Set FileLock = fso.OpenTextFile("C:\FileLock.txt", ForReading)
    Dim LockBit As Integer
        LockBit = FileLock.ReadAll
    FileLock.Close

    'If the bit is 1 (file in use) then wait 1 second and try again (up to 10 times)
    For try = 1 To 10
        If LockBit = 1 Then
            Application.Wait (Now + TimeValue("0:00:1"))
            Set FileLock = fso.OpenTextFile("C:\FileLock.txt", ForReading)
            LockBit = FileLock.ReadAll
            FileLock.Close
        Else: GoTo Line1 'when the bit is 0 (file available)
        End If
        If try = 10 Then
            MsgBox "File not available"
            Exit Sub
        End If
    Next try

Line1:
    Call LockTheFile(fso, True) 'Change the lock bit to "1" to show the file's in use
    Set WriteFile = fso.OpenTextFile("C:\WriteFile.txt", ForWriting)
        'Do what you will with the file
        MsgBox "Write Successful"
    WriteFile.Close
    Call LockTheFile(fso, False) 'Change the lock bit to "0" to show the file's available

End Sub

I made this sub separate to make the main code more streamlined

Sub LockTheFile(fso, SetLock As Boolean)
    'Write "1" to a lock file to indicate the text file is in use, or "0" to indicate not in use
    Set BitFile = fso.CreateTextFile("C:\FileLock.txt", True)

    If SetLock = True Then
        BitFile.WriteLine "1"
    Else
        BitFile.WriteLine "0"
    End If

    BitFile.Close
End Sub

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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