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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow