Vbscript 如何确定文件是否使用VBS锁定?

Vbscript 如何确定文件是否使用VBS锁定?,vbscript,wsh,filesystemobject,Vbscript,Wsh,Filesystemobject,我正在写一个VB脚本来更新网络上的一些文件。在开始之前,我想知道是否有任何文件被锁定。我想在做任何更新之前先做这个 我知道,如果在尝试替换文件时文件被锁定,我可以处理该错误,但我确实希望在开始更新任何文件之前知道是否有任何文件被锁定 是否有任何方法可以看到文件是使用VBS锁定的(除了尝试替换它)?此函数确定是否可以在“写入”模式下访问感兴趣的文件。这与确定文件是否被进程锁定并不完全相同。不过,你可能会发现它对你的情况有效。(至少在更好的事情出现之前。) 当文件被另一个进程锁定时,此函数将指示无法

我正在写一个VB脚本来更新网络上的一些文件。在开始之前,我想知道是否有任何文件被锁定。我想在做任何更新之前先做这个

我知道,如果在尝试替换文件时文件被锁定,我可以处理该错误,但我确实希望在开始更新任何文件之前知道是否有任何文件被锁定


是否有任何方法可以看到文件是使用VBS锁定的(除了尝试替换它)?

此函数确定是否可以在“写入”模式下访问感兴趣的文件。这与确定文件是否被进程锁定并不完全相同。不过,你可能会发现它对你的情况有效。(至少在更好的事情出现之前。)

当文件被另一个进程锁定时,此函数将指示无法进行“写入”访问。但是,它无法将该条件与阻止“写入”访问的其他条件区分开来。例如,如果文件设置了只读位或具有限制性NTFS权限,则也不可能进行“写”访问。当进行“写入”访问尝试时,所有这些条件都将导致“权限被拒绝”

还请注意,如果文件被另一个进程锁定,则此函数返回的答案仅在函数执行时可靠。因此,并发问题是可能的

如果发现以下任何条件:“未找到文件”、“未找到路径”或“非法文件名”(“错误的文件名或编号”),将引发异常

函数可写可访问(sFilePath)
'策略:尝试以'append'模式打开指定的文件。
'似乎不会更改文件上的“修改”日期。
'可用于二进制文件和文本文件。
这里只需要“ForAppending”。定义这些常量
'如果您在中的其他位置需要它们,则在该函数之外
'您的源文件。
读取常数=1,写入常数=2,外观常数=8
IsWriteAccessible=False
Dim of so:Set of so=CreateObject(“Scripting.FileSystemObject”)
出错时继续下一步
调光能率:能率=0
Dim sDesc:sDesc=“”
Dim of ile:Set of ile=oFso.OpenTextFile(sFilePath,用于外观)
如果Err.Number=0,则
奥菲尔,关门
如果有错误,那么
nErr=错误编号
sDesc=错误描述
其他的
IsWriteAccessible=True
如果结束
其他的
选择案例错误编号
案例70
'权限被拒绝,因为:
“-文件已由另一个进程打开
'-在文件*上设置了只读位,或*
'-文件上的NTFS访问控制列表设置(ACL)
'阻止访问
其他情况
'52-错误的文件名或编号
'53-找不到文件
'76-找不到路径
nErr=错误编号
sDesc=错误描述
结束选择
如果结束
"以下两句话是多余的。VB6垃圾
当此函数完成时,收集器将释放'oFile'和'oFso'
“它们超出了范围。有关更多信息,请参阅Eric Lippert的文章:
'   http://blogs.msdn.com/b/ericlippert/archive/2004/04/28/when-are-you-required-to-set-objects-to-nothing.aspx
'文件集=无
'一套SO=零
错误转到0
如果是nErr那么
错误。提高nErr,sDesc
如果结束
端函数

下面的脚本尝试写入文件30秒,然后放弃。当我们所有的用户都必须点击一个脚本时,我需要这个。有可能是多个用户试图同时写入。OpenCSV()尝试打开文件30次,间隔1秒

  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
或者,更简单地说:

假设VBS中已经有一个名为FileName的变量,该变量包含要测试的完整文件路径:

Dim oFso, oFile
Set oFso = CreateObject("Scripting.FileSystemObject")
Set oFile = oFso.OpenTextFile(FileName, 8, True)
If Err.Number = 0 Then oFile.Close
第3行尝试在启用附加权限的情况下打开要测试的文件。e、 g.它试图用写锁打开文件

如果使用写锁定打开文件时产生错误,则VBS将在第三行出错,并且不会继续。在这一点上,无论您在哪里调用VBS,您的错误处理都应该起作用。如果无法获得写锁,则错误消息将为“权限被拒绝”


如果使用锁打开文件不会导致错误,那么第4行将再次关闭该文件。您现在可以打开该文件或对其执行任何操作,确信它没有写锁定。

Darin注意到(在其他回答中)该模块应包括:
Const ForReading=1,forwrite=2,ForAppending=8
@Smandoli-感谢您提醒我注意这一遗漏。我已经相应地更新了代码。还请注意我在函数末尾将文件
设置为的和的设置为的前面的注释。