Поиск…


замечания

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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow