How can I determine if a file is locked using VBS?

后端 未结 2 1259
执笔经年
执笔经年 2020-12-04 01:47

I am writing a VB Script to update some files on the network. Before beginning, I want to know if any of the files are locked. I\'d like to do this before I actuall

相关标签:
2条回答
  • 2020-12-04 02:25

    This function determines whether a file of interest can be accessed in 'write' mode. This is not exactly the same as determining whether a file is locked by a process. Still, you may find that it works for your situation. (At least until something better comes along.)

    This function will indicate that 'write' access is not possible when a file is locked by another process. However, it cannot distinguish that condition from other conditions that prevent 'write' access. For instance, 'write' access is also not possible if a file has its read-only bit set or possesses restrictive NTFS permissions. All of these conditions will result in 'permission denied' when a 'write' access attempt is made.

    Also note that if a file is locked by another process, the answer returned by this function is reliable only at the moment the function is executed. So, concurrency problems are possible.

    An exception is thrown if any of these conditions are found: 'file not found', 'path not found', or 'illegal file name' ('bad file name or number').

    Function IsWriteAccessible(sFilePath)
        ' Strategy: Attempt to open the specified file in 'append' mode.
        ' Does not appear to change the 'modified' date on the file.
        ' Works with binary files as well as text files.
    
        ' Only 'ForAppending' is needed here. Define these constants
        ' outside of this function if you need them elsewhere in
        ' your source file.
        Const ForReading = 1, ForWriting = 2, ForAppending = 8
    
        IsWriteAccessible = False
    
        Dim oFso : Set oFso = CreateObject("Scripting.FileSystemObject")
    
        On Error Resume Next
    
        Dim nErr : nErr = 0
        Dim sDesc : sDesc = ""
        Dim oFile : Set oFile = oFso.OpenTextFile(sFilePath, ForAppending)
        If Err.Number = 0 Then
            oFile.Close
            If Err Then
                nErr = Err.Number
                sDesc = Err.Description
            Else
                IsWriteAccessible = True
            End if
        Else
            Select Case Err.Number
                Case 70
                    ' Permission denied because:
                    ' - file is open by another process
                    ' - read-only bit is set on file, *or*
                    ' - NTFS Access Control List settings (ACLs) on file
                    '   prevents access
    
                Case Else
                    ' 52 - Bad file name or number
                    ' 53 - File not found
                    ' 76 - Path not found
    
                    nErr = Err.Number
                    sDesc = Err.Description
            End Select
        End If
    
        ' The following two statements are superfluous. The VB6 garbage
        ' collector will free 'oFile' and 'oFso' when this function completes
        ' and they go out of scope. See Eric Lippert's article for more:
        '   http://blogs.msdn.com/b/ericlippert/archive/2004/04/28/when-are-you-required-to-set-objects-to-nothing.aspx
    
        'Set oFile = Nothing
        'Set oFso = Nothing
    
        On Error GoTo 0
    
        If nErr Then
            Err.Raise nErr, , sDesc
        End If
    End Function
    
    0 讨论(0)
  • 2020-12-04 02:49

    The script below tries to write to a file for 30 seconds and gives up after that. I needed this when all our users had to click on a script. Chances are that multiple users try to write at the same time. OpenCSV() tries to open the file 30 times with a delay of 1 second in between.

      Const ForAppending = 8
    
      currentDate = Year(Now) & "-" & Month(Now) & "-" & Day(Now) & " " & Hour(Now) & ":" & Minute(Now) & ":" & Second(Now)
      filepath = "\\network\path\file.csv"
      Set oCSV = OpenCSV( filepath ) 
      oCSV.WriteLine( currentDate )
      oCSV.Close
    
      Function OpenCSV( path )
        Set oFS = CreateObject( "Scripting.FileSystemObject" )
        For i = 0 To 30
          On Error Resume Next
          Set oFile = oFS.OpenTextFile( path, ForAppending, True )
          If Not Err.Number = 70 Then
            Set OpenCSV = oFile
            Exit For
          End If
          On Error Goto 0
          Wscript.Sleep 1000
        Next
        Set oFS = Nothing
        Set oFile = Nothing
        If Err.Number = 70 Then
          MsgBox "File " & filepath & " is locked and timeout was exceeded.", vbCritical
          WScript.Quit
        End If
      End Function
    
    0 讨论(0)
提交回复
热议问题