Я использую функцию, которая вызывает в 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
+1 для ответа на свой вопрос и настойчивость. Что касается магии '260', вполне вероятно, что' Dir $() 'попадает в ограничение MAX_PATH': http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247.aspx –
ах спасибо! вот и все. было бы неплохо, если бы они предоставили еще одну ошибку, чем «файл не найден» :) – Hrqls
@Hrqls Я подозреваю, что среда выполнения VB просто скопировала 260 символов из строки файла в буфер из 260 символов (то есть размером до MAX_PATH), таким образом неявно усекая имя файла до 259 символов (включая нулевой ограничитель). Неудивительно, что этого файла не существует. –