VBA
Praca z plikami i katalogami bez użycia FileSystemObject
Szukaj…
Uwagi
Scripting.FileSystemObject
jest znacznie bardziej solidny niż starsze metody w tym temacie. Powinien być preferowany w prawie wszystkich przypadkach.
Określanie, czy istnieją foldery i pliki
Akta:
Aby ustalić, czy plik istnieje, wystarczy przekazać nazwę pliku do funkcji Dir$
i przetestować, czy zwraca wynik. Zauważ, że Dir$
obsługuje symbole wieloznaczne, więc aby przetestować konkretny plik, przekazana pathName
powinna zostać przetestowana, aby upewnić się, że go nie zawiera. W poniższej próbce pojawia się błąd - jeśli nie jest to pożądane zachowanie, funkcję można zmienić, aby po prostu zwrócić 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
Foldery (metoda Dir $):
Funkcji Dir$()
można również użyć do ustalenia, czy folder istnieje, określając przekazanie vbDirectory
dla opcjonalnego parametru attributes
. W takim przypadku przekazana wartość pathName
musi kończyć się separatorem ścieżki ( \
), ponieważ pasujące nazwy plików spowodują fałszywe alarmy. Należy pamiętać, że symbole wieloznaczne są dozwolone tylko po ostatnim separatorze ścieżek, więc poniższa przykładowa funkcja wyrzuci błąd 52 - „Zła nazwa pliku lub numer”, jeśli dane wejściowe zawierają symbol wieloznaczny. Jeśli nie jest to pożądane zachowanie, usuń komentarz przy On Error Resume Next
w górnej części funkcji. Pamiętaj również, że Dir$
obsługuje względne ścieżki plików (tj. ..\Foo\Bar
), więc wyniki są gwarantowane tylko tak długo, jak bieżący katalog roboczy nie zostanie zmieniony.
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
Foldery (metoda ChDir):
Za ChDir
instrukcji ChDir
można również sprawdzić, czy folder istnieje. Zauważ, że ta metoda tymczasowo zmieni środowisko, w którym działa VBA, więc jeśli jest to rozważane, zamiast tego należy użyć metody Dir$
. Ma tę zaletę, że dzięki temu parametrowi jest o wiele mniej wybaczający. Ta metoda obsługuje również względne ścieżki plików, więc ma takie samo zastrzeżenie jak metoda 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
Tworzenie i usuwanie folderów plików
UWAGA: Dla zwięzłości w poniższych przykładach wykorzystano funkcję FolderExists z przykładu Określanie, czy foldery i pliki istnieją w tym temacie.
Do utworzenia nowego folderu można MkDir
instrukcji MkDir
. Akceptuje ścieżki zawierające litery dysków ( C:\Foo
), nazwy UNC ( \\Server\Foo
), ścieżki względne ( ..\Foo
) lub bieżący katalog roboczy ( Foo
).
Jeśli nazwa dysku lub UNC zostanie pominięta (np. \Foo
), folder zostanie utworzony na bieżącym dysku. Może to być lub nie ten sam dysk, co bieżący katalog roboczy.
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
Za RmDir
instrukcji RmDir
można usunąć istniejące foldery. Akceptuje ścieżki w tych samych formach co MkDir
i używa tej samej relacji z bieżącym katalogiem roboczym i dyskiem. Należy pamiętać, że oświadczenie jest podobna do systemu Windows rd
polecenie powłoki, więc rzuci błąd run-time 75: „Błąd dostępu do ścieżki / pliku” jeśli katalog docelowy nie jest pusty.
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