VBA
Arbeta med filer och kataloger utan att använda FileSystemObject
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