2016-02-11 3 views
0

В VBScript, я хочу знать, если файл существует:Различать «файл не существует» и «отказано в доступе»

Set fso = CreateObject("Scripting.FileSystemObject") 
If Not (fso.FileExists(file)) Then 
    msg = " doesn't exist." 
End If 

Мои файлы находятся на внутренней сети.

Есть ли способ отличить:

  • файл на самом деле не существует
  • отказано в доступе

Стараюсь с fso.OpenTextFile, но результат для этих двух случаев всегда: Err.Number = 5.

+0

Вы говорите, что 'fso.FileExists (файл)' возвращает 'False', даже если файл существует, но у вас нет разрешения? У меня возникла бы непредвиденная ошибка «Разрешенная ошибка» ... – Lankymart

+0

Недоступные файлы существуют (поэтому .FileExists не вызовет ошибки, но вернет True), а .OpenTextFile вернет «Permission denied», если существующий файл isn ' t доступно. –

+0

@ Ekkehard.Horner Это то, что я пытался установить, казалось странным, OP предлагал, чтобы «FileExists» возвращал «False». – Lankymart

ответ

3

Чтобы различить несуществующие и не доступные файлы, вам нужны .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 
+3

'FileExists' здесь не требуется. 'OpenTextFile' вызывает разные ошибки для обоих случаев (ошибка 53: файл не найден, ошибка 70: ​​доступ запрещен). –

+0

Спасибо вам обоим. Я приму ваше решение, потому что мой вопрос был недостаточно ясным. У меня все еще есть эта проблема (потому что мои файлы иногда находятся в каталоге, в котором я не имею права доступа, но я думаю, что в vbs нет решения). –

+0

@MariusSeheia Вы не можете перечислить содержимое папки, для которой у вас нет прав доступа. Для этого вам понадобится служба, предоставляющая вам окончательный список файлов/папок в системе. –

 Смежные вопросы

  • Нет связанных вопросов^_^