Sök…


Anmärkningar

Scripting.FileSystemObject är mycket mer robust än arvsmetoderna i detta ämne. Det bör föredras i nästan alla fall.

Bestämma om mappar och filer finns

filer:

För att bestämma om en fil finns, skicka bara filnamnet till Dir$ -funktionen och testa om den returnerar ett resultat. Observera att Dir$ stöder jokertecken, så för att testa för en specifik fil, ska det skickade pathName testas för att se till att det inte innehåller dem. Exemplet nedan ger ett fel - om detta inte är önskat beteende kan funktionen ändras för att helt enkelt returnera 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

Mappar (Dir $ -metod):

Den Dir$() funktionen kan också användas för att bestämma om en mapp existerar genom att ange att passera vbDirectory för valfria attributes parameter. I det här fallet måste det godkända pathName sluta med en sökvägsavskiljare ( \ ), eftersom matchande filnamn orsakar falska positiver. Tänk på att vildkort endast är tillåtna efter den sista sökvägsavskiljaren, så exempelfunktionen nedan kommer att kasta ett körtidfel 52 - "Dåligt filnamn eller nummer" om ingången innehåller ett jokertecken. Om detta inte är önskat beteende, avmarkera komponent vid On Error Resume Next längst upp i funktionen. Kom också ihåg att Dir$ stöder relativa filvägar (dvs ..\Foo\Bar ), så resultaten garanteras bara att vara giltiga så länge den aktuella arbetskatalogen inte ändras.

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

Mappar (ChDir-metod):

ChDir uttalandet kan också användas för att testa om en mapp finns. Observera att den här metoden tillfälligt kommer att förändra den miljö som VBA kör i, så om det är en övervägande bör Dir$ -metoden användas istället. Det har fördelen att vara mycket mindre förlåtande med sin parameter. Den här metoden stöder också relativa filvägar, så har samma förbehåll som Dir$ -metoden.

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

Skapa och ta bort filmappar


OBS: För korthet använder exemplen nedan funktionen FolderExists från exemplet Bestämma om mappar och filer finns i detta ämne.


MkDir uttalandet kan användas för att skapa en ny mapp. Den accepterar banor som innehåller enhetsbokstäver ( C:\Foo ), UNC-namn ( \\Server\Foo ), relativa banor ( ..\Foo ) eller den aktuella arbetskatalogen ( Foo ).

Om enheten eller UNC-namnet utelämnas (dvs. \Foo ) skapas mappen på den aktuella enheten. Det kan hända att det inte är samma enhet som den aktuella arbetskatalogen.

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 uttalandet kan användas för att ta bort befintliga mappar. Den accepterar banor i samma former som MkDir och använder samma förhållande till den aktuella arbetskatalogen och enheten. Observera att uttalandet liknar kommandot Windows rd shell, så det kastar ett körtidfel 75: "Path / File access-fel" om målkatalogen inte är tom.

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow