Buscar..


Observaciones

El Scripting.FileSystemObject es mucho más robusto que los métodos heredados en este tema. Se debe preferir en casi todos los casos.

Determinar si existen carpetas y archivos

Archivos:

Para determinar si existe un archivo, simplemente pase el nombre de archivo a la función Dir$ y compruebe si devuelve un resultado. Tenga en cuenta que Dir$ admite comodines, por lo que para probar un archivo específico , el nombre de pathName pasado se debe probar para asegurarse de que no los contiene. La muestra a continuación genera un error: si este no es el comportamiento deseado, la función se puede cambiar para que simplemente devuelva 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

Carpetas (método Dir $):

La función Dir$() también se puede usar para determinar si existe una carpeta al especificar vbDirectory para el parámetro de attributes opcional. En este caso, el pasado pathName valor debe terminar con un separador de ruta ( \ ), como búsqueda de nombres de archivos hará que los falsos positivos. Tenga en cuenta que los comodines solo se permiten después del último separador de ruta, por lo que la siguiente función de ejemplo arrojará un error de tiempo de ejecución 52 - "Nombre o número de archivo incorrecto" si la entrada contiene un comodín. Si este no es el comportamiento deseado, elimine el comentario On Error Resume Next en la parte superior de la función. También recuerde que Dir$ admite rutas de archivo relativas (es decir, ..\Foo\Bar ), por lo que se garantiza que los resultados solo serán válidos siempre que no se cambie el directorio de trabajo actual.

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

Carpetas (método ChDir):

La instrucción ChDir también se puede utilizar para probar si existe una carpeta. Tenga en cuenta que este método cambiará temporalmente el entorno en el que se está ejecutando VBA, por lo que si eso es una consideración, se debe usar el método Dir$ su lugar. Tiene la ventaja de ser mucho menos tolerante con su parámetro. Este método también admite rutas de archivo relativas, por lo que tiene la misma advertencia que el método 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

Creación y eliminación de carpetas de archivos


NOTA: para mayor brevedad, los siguientes ejemplos utilizan la función FolderExists del ejemplo de Determinación de si existen carpetas y archivos en este tema.


La declaración MkDir se puede utilizar para crear una nueva carpeta. Acepta rutas que contienen letras de unidad ( C:\Foo ), nombres UNC ( \\Server\Foo ), rutas relativas ( ..\Foo ) o el directorio de trabajo actual ( Foo ).

Si se omite la unidad o el nombre UNC (es decir, \Foo ), la carpeta se crea en la unidad actual. Este puede o no ser el mismo disco que el directorio de trabajo actual.

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

La instrucción RmDir se puede utilizar para eliminar carpetas existentes. Acepta rutas en las mismas formas que MkDir y usa la misma relación con el directorio y la unidad de trabajo actuales. Tenga en cuenta que la instrucción es similar al comando de Windows rd shell, por lo que arrojará un error de tiempo de ejecución 75: "Error de acceso a la ruta / archivo" si el directorio de destino no está vacío.

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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow