VBA
Работа с файлами и каталогами без использования FileSystemObject
Поиск…
замечания
Scripting.FileSystemObject
гораздо более надежный, чем унаследованные методы в этом разделе. Это должно быть предпочтительным почти во всех случаях.
Определение наличия папок и файлов
файлы:
Чтобы определить, существует ли файл, просто передайте имя файла функции Dir$
и проверьте, возвращает ли он результат. Обратите внимание, что Dir$
поддерживает wild-cards, поэтому для проверки определенного файла переданное имя pathName
должно быть проверено, чтобы убедиться, что оно не содержит их. В приведенном ниже примере возникает ошибка - если это не желаемое поведение, функцию можно изменить, чтобы просто вернуть False
.
Public Function FileExists(pathName As String) As Boolean
If InStr(1, pathName, "*") Or InStr(1, pathName, "?") Then
'Exit Function 'Return False on wild-cards.
Err.Raise 52 'Raise error on wild-cards.
End If
FileExists = Dir$(pathName) <> vbNullString
End Function
Папки (метод Dir $):
Функция Dir$()
также может использоваться, чтобы определить, существует ли папка, указывая передачу vbDirectory
для параметра необязательных attributes
. В этом случае переданное значение pathName
должно заканчиваться разделителем пути ( \
), поскольку совпадающие имена файлов будут вызывать ложные срабатывания. Имейте в виду, что wild-cards разрешены только после последнего разделителя путей, поэтому приведенная ниже функция примера будет вызывать ошибку времени выполнения 52 - «Плохое имя или номер файла», если вход содержит wild-card. Если это не является желаемым поведением, раскомментируйте On Error Resume Next
в верхней части функции. Также помните, что Dir$
поддерживает относительные пути к файлу (то есть ..\Foo\Bar
), поэтому результаты гарантируются только в том случае, если текущий рабочий каталог не изменяется.
Public Function FolderExists(ByVal pathName As String) As Boolean
'Uncomment the "On Error" line if paths with wild-cards should return False
'instead of raising an error.
'On Error Resume Next
If pathName = vbNullString Or Right$(pathName, 1) <> "\" Then
Exit Function
End If
FolderExists = Dir$(pathName, vbDirectory) <> vbNullString
End Function
Папки (метод ChDir):
Оператор ChDir
также может использоваться для проверки наличия папки. Обратите внимание, что этот метод временно изменит среду, в которой работает VBA, поэтому, если это необходимо, вместо этого следует использовать метод Dir$
. У этого есть преимущество, заключающееся в том, что он намного менее прощает свой параметр. Этот метод также поддерживает относительные пути к файлам, поэтому имеет ту же оговорку, что и метод Dir$
.
Public Function FolderExists(ByVal pathName As String) As Boolean
'Cache the current working directory
Dim cached As String
cached = CurDir$
On Error Resume Next
ChDir pathName
FolderExists = Err.Number = 0
On Error GoTo 0
'Change back to the cached working directory.
ChDir cached
End Function
Создание и удаление файловых папок
ПРИМЕЧАНИЕ. Для краткости в приведенных ниже примерах используйте функцию FolderExists из примера « Определение файлов и файлов» в этом разделе.
Оператор MkDir
может использоваться для создания новой папки. Он принимает пути, содержащие буквы дисков ( C:\Foo
), имена UNC ( \\Server\Foo
), относительные пути ( ..\Foo
) или текущий рабочий каталог ( Foo
).
Если имя диска или UNC опущено (например, \Foo
), папка создается на текущем диске. Это может быть или не быть тем же диском, что и текущий рабочий каталог.
Public Sub MakeNewDirectory(ByVal pathName As String)
'MkDir will fail if the directory already exists.
If FolderExists(pathName) Then Exit Sub
'This may still fail due to permissions, etc.
MkDir pathName
End Sub
Оператор RmDir
может использоваться для удаления существующих папок. Он принимает пути в тех же формах, что и MkDir
и использует то же отношение к текущему рабочему каталогу и диску. Обратите внимание, что оператор похож на команду оболочки Windows rd
, поэтому будет вызывать ошибку времени выполнения 75: «Ошибка доступа к пути / файлу», если целевой каталог не пуст.
Public Sub DeleteDirectory(ByVal pathName As String)
If Right$(pathName, 1) <> "\" Then
pathName = pathName & "\"
End If
'Rmdir will fail if the directory doesn't exist.
If Not FolderExists(pathName) Then Exit Sub
'Rmdir will fail if the directory contains files.
If Dir$(pathName & "*") <> vbNullString Then Exit Sub
'Rmdir will fail if the directory contains directories.
Dim subDir As String
subDir = Dir$(pathName & "*", vbDirectory)
Do
If subDir <> "." And subDir <> ".." Then Exit Sub
subDir = Dir$(, vbDirectory)
Loop While subDir <> vbNullString
'This may still fail due to permissions, etc.
RmDir pathName
End Sub