2013-05-07 3 views
0

Я использую следующий код, чтобы проверить, существует ли файл:Ошибка 53 при проверке, если файл существует

If Len(Dir$(strFile)) > 0 Then 

Это работало отлично до сегодняшнего дня.

В некоторых случаях я получаю следующее сообщение об ошибке:

enter image description here

Точки ошибки в строке кода выше.

Я знаю, что файл не существует, но я не хочу, чтобы эта ошибка появлялась.

ответ

4

Я забыл что-то сказать: имя файла динамично и зависит от другого процесса.

Я только заметил, что при возникновении ошибки другой процесс возвращает мусор, вызывающий длинное имя файла около 2000 символов.

Я так и не понял, что существует ограничение на длину имен файлов.

Я создал небольшой проект, чтобы проверить это, и оказалось, что верхний предел составляет 259 символов:

Option Explicit 

Private Sub Command1_Click() 
    Dim strFile As String 
    Dim intLength As Integer 
    strFile = App.Path & "\" 
    intLength = 259 - Len(strFile) 
    strFile = strFile & String(intLength, "a") 
    If Len(Dir$(strFile)) = 0 Then 
    MsgBox "file does not exist" 
    End If 
End Sub 

Используя значение 259 отлично работает, но 260 выдает ошибку.

+2

+1 для ответа на свой вопрос и настойчивость. Что касается магии '260', вполне вероятно, что' Dir $() 'попадает в ограничение MAX_PATH': http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247.aspx –

+0

ах спасибо! вот и все. было бы неплохо, если бы они предоставили еще одну ошибку, чем «файл не найден» :) – Hrqls

+0

@Hrqls Я подозреваю, что среда выполнения VB просто скопировала 260 символов из строки файла в буфер из 260 символов (то есть размером до MAX_PATH), таким образом неявно усекая имя файла до 259 символов (включая нулевой ограничитель). Неудивительно, что этого файла не существует. –

1

Я использую функцию, которая вызывает в Windows API для этого. Эта функция обрабатывает пробелы и длинные имена файлов.

Добавить в раздел объявлений:

Private Declare Function CloseHandle Lib "Kernel32" (ByVal hObject As Long) As Long 
Private Declare Function CreateFile Lib "Kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Any) As Long 

Private Type SECURITY_ATTRIBUTES 
    nLength As Long 
    lpSecurityDescriptor As Long 
    bInheritHandle As Long 
End Type 

Private Const OPEN_EXISTING = 3 
Private Const FILE_SHARE_READ = &H1 
Private Const GENERIC_READ = &H80000000 
Private Const INVALID_HANDLE_VALUE = -1 

Действительная функция

Function FileExists(ByVal fSpec As String) As Boolean 
    Dim lngResult As Long 
    Dim udtSA As SECURITY_ATTRIBUTES 

    On Error GoTo errFileExists 

    If Len(fSpec) > 0 Then 
     udtSA.nLength = Len(udtSA) 
     udtSA.bInheritHandle = 1& 
     udtSA.lpSecurityDescriptor = 0& 
     lngResult = CreateFile(fSpec, GENERIC_READ, FILE_SHARE_READ, udtSA, OPEN_EXISTING, 0&, 0&) 
     If lngResult <> INVALID_HANDLE_VALUE Then 
      Call CloseHandle(lngResult) 
      FileExists = True 
     Else 
      Select Case Err.LastDllError 'some errors may indicate the file exists, but there was an error opening it 
       Case Is = ERROR_SHARING_VIOLATION 
        FileExists = True 

       Case Else 
        FileExists = False 

      End Select 
     End If 
    End If 

Exit Function 

errFileExists: 
    Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext 

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