Vbscript 区别于;文件不存在';“不存在”;及;“拒绝访问”;

Vbscript 区别于;文件不存在';“不存在”;及;“拒绝访问”;,vbscript,file-exists,fso,Vbscript,File Exists,Fso,在VBScript中,我想知道文件是否存在: Set fso = CreateObject("Scripting.FileSystemObject") If Not (fso.FileExists(file)) Then msg = " doesn't exist." End If 我的文件在内部网络上 有没有办法区分: 文件确实不存在 拒绝访问 我尝试使用fso.OpenTextFile,但这两种情况的结果总是:Err.Number=5。以区分您需要的不存在和不可访问的文件。F

在VBScript中,我想知道文件是否存在:

Set fso = CreateObject("Scripting.FileSystemObject")
If Not (fso.FileExists(file)) Then
  msg = " doesn't exist." 
End If  
我的文件在内部网络上

有没有办法区分:

  • 文件确实不存在
  • 拒绝访问

我尝试使用
fso.OpenTextFile
,但这两种情况的结果总是:
Err.Number
=5。

以区分您需要的不存在和不可访问的文件。FileExists。OpenTextFile:

Option Explicit

Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject")

Function ReadFile(p, ByRef m)
  If goFS.FileExists(p) Then
     Dim aErr
     On Error Resume Next
      Set ReadFile = goFS.OpenTextFile(p)
      aErr = Array(Err.Number, Err.Description)
     On Error GoTo 0
     If aErr(0) Then
        m = p & " - " & aErr(1)
        Set ReadFile = Nothing
     Else
        m = ""
     End If
  Else
     Set ReadFile = Nothing
     m = p & " - no such file"
  End If
End Function

Dim p, m
For Each p In Split("e:\roots.own e:\nosuchfile e:\dirsbf.tmp")
    Dim tsIn : Set tsIn = ReadFile(p, m)
    If tsIn Is Nothing Then
       WScript.Echo "fail", m
    Else
       ' read from tsIn
       tsIn.Close
       WScript.Echo "ok"
    End If
Next
输出:

cscript 35338634.vbs
fail e:\roots.own - Permission denied
fail e:\nosuchfile - no such file
ok
由于Ansgar的观察,功能可以得到改进:

Function ReadFile(p, ByRef m)
  Dim aErr
 On Error Resume Next
  Set ReadFile = goFS.OpenTextFile(p)
  aErr = Array(Err.Number, Err.Description)
 On Error GoTo 0
  If aErr(0) Then
     m = p & " - " & aErr(1)
     Set ReadFile = Nothing
  Else
     m = ""
  End If
End Function

要区分您所需的不存在和不可访问的文件。FileExists。OpenTextFile:

Option Explicit

Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject")

Function ReadFile(p, ByRef m)
  If goFS.FileExists(p) Then
     Dim aErr
     On Error Resume Next
      Set ReadFile = goFS.OpenTextFile(p)
      aErr = Array(Err.Number, Err.Description)
     On Error GoTo 0
     If aErr(0) Then
        m = p & " - " & aErr(1)
        Set ReadFile = Nothing
     Else
        m = ""
     End If
  Else
     Set ReadFile = Nothing
     m = p & " - no such file"
  End If
End Function

Dim p, m
For Each p In Split("e:\roots.own e:\nosuchfile e:\dirsbf.tmp")
    Dim tsIn : Set tsIn = ReadFile(p, m)
    If tsIn Is Nothing Then
       WScript.Echo "fail", m
    Else
       ' read from tsIn
       tsIn.Close
       WScript.Echo "ok"
    End If
Next
输出:

cscript 35338634.vbs
fail e:\roots.own - Permission denied
fail e:\nosuchfile - no such file
ok
由于Ansgar的观察,功能可以得到改进:

Function ReadFile(p, ByRef m)
  Dim aErr
 On Error Resume Next
  Set ReadFile = goFS.OpenTextFile(p)
  aErr = Array(Err.Number, Err.Description)
 On Error GoTo 0
  If aErr(0) Then
     m = p & " - " & aErr(1)
     Set ReadFile = Nothing
  Else
     m = ""
  End If
End Function

你是说即使文件存在但你没有权限,
fso.FileExists(file)
返回
False
?我将生成一个意外的
权限被拒绝
错误…存在不可访问的文件(因此.FileExists将不会引发错误,但返回True),而.OpenTextFile将返回“权限被拒绝”如果无法访问现有文件。@Ekkehard.Horner(我试图建立的文件)似乎很奇怪,OP建议
FileExists
返回
False
。VBScript中的错误5是
无效的过程调用或参数
,因此,当您同时调用这两个函数时,很可能您实际上做错了什么
FileExists
OpenTextFile
。由于常见的控制变量是
file
变量,您确定
file
包含有效值吗?您是说
fso.FileExists(file)
返回
False
,即使文件存在但您没有权限?我将生成一个意外的
权限被拒绝
错误…存在不可访问的文件(因此.FileExists将不会引发错误,但返回True),而.OpenTextFile将返回“权限被拒绝”如果无法访问现有文件。@Ekkehard.Horner(我试图建立的文件)似乎很奇怪,OP建议
FileExists
返回
False
。VBScript中的错误5是
无效的过程调用或参数
,因此,当您同时调用这两个函数时,很可能您实际上做错了什么
FileExists
OpenTextFile
。由于公共支配符是
文件
变量,您确定
文件
包含有效值吗?
文件存在
此处不需要
OpenTextFile
针对这两种情况都会引发不同的错误(错误53:找不到文件;错误70:拒绝访问)。谢谢大家。我会接受你的解决方案,因为我的问题不够清楚。我仍然有这个问题(因为我的文件有时位于我无权访问的目录中,但我认为在vbs中没有解决方案)。@MariusSeheia您不能枚举您没有访问权限的文件夹的内容。您需要一项服务,为您提供系统上文件/文件夹的最终列表来解决此问题。
FileExists
此处不需要
OpenTextFile
针对这两种情况都会引发不同的错误(错误53:找不到文件;错误70:拒绝访问)。谢谢大家。我会接受你的解决方案,因为我的问题不够清楚。我仍然有这个问题(因为我的文件有时位于我无权访问的目录中,但我认为在vbs中没有解决方案)。@MariusSeheia您不能枚举您没有访问权限的文件夹的内容。您需要一项服务,为您提供系统上文件/文件夹的最终列表,以解决此问题。