FileSystemObject in VBA – Explained

FileSystemObject zwany również FSO, zapewnia łatwy obiektowy model dostępu do systemu plików komputera. Wystarczy utworzyć instancję FileSystemObject w VBA, a następnie można generować pliki, odczytywać pliki, usuwać pliki, iterować po folderach i wykonywać wiele innych operacji na systemie plików komputera.

FileSystemObject jest obecny wewnątrz Microsoft Scripting Runtime Library, tj. Scrrun.dll. Ta biblioteka DLL obsługuje tworzenie i manipulację plikami za pomocą obiektu TextStream i to jest powód, dla którego FSO nie obsługuje operacji na plikach binarnych.

Table of Contents

Użycia obiektu File System Object

FileSystemObject może być używany do wielu zadań, takich jak:

  • Tworzenie, otwieranie, czytanie, pisanie i usuwanie plików tekstowych.
  • Tworzenie, zmienianie i usuwanie folderów.
  • Iterowanie plików i folderów.
  • Kopiowanie i przenoszenie plików lub folderów.
  • Sprawdzanie, czy lokalizacja (ścieżka pliku) istnieje, czy nie.

Dostęp do FileSystemObject

Obiekt FileSystemObject składa się z kilku kolekcji obiektów, a każda z tych kolekcji obiektów zawiera informacje o określonym aspekcie systemu plików. Te kolekcje to:

Object Description
Drive Ten obiekt pozwala uzyskać informacje o napędzie dołączonym do systemu. Na przykład, może powiedzieć o dostępnym miejscu na dysku, jego nazwie logicznej itd. Zauważ, że obiekt napędu, o którym tutaj mówimy, nie musi oznaczać dysku twardego, może to być CD-ROM, napęd Flash, pamięć RAM lub nawet logicznie podłączony napęd przez sieć LAN.
Folder Ten obiekt pozwala na tworzenie, usuwanie, przenoszenie lub odpytywanie hierarchii folderów.
File Ten obiekt pozwala na tworzenie, usuwanie, przenoszenie lub odpytywanie pliku.
TextStream Obiekt TextStream pozwala na odczyt lub zapis plików tekstowych.

Więc, schematycznie FileSystemObject można przedstawić jako:

Proszę zauważyć, że FSO komunikuje się z większością powyższych obiektów pośrednio. Bezpośrednio zawiera tylko kolekcję obiektów „Napędy”. Każdy obiekt „Napęd” w kolekcji „Napędy” zawiera łańcuch obiektów „Folder”. A każdy obiekt „Folder” zawiera kolekcję „File”.

Aby to było bardziej zrozumiałe, powiedzmy to w ten sposób: A FileSystemObject zawiera trzy główne metody do pobierania (odczytu) określonych informacji o Napędach, Folderach lub Plikach, te metody są GetDrive, GetFolder i GetFile odpowiednio. Załóżmy, że potrzebujemy znaleźć rozmiar pliku określonego pliku, więc utworzymy instancję metody GetFile , a następnie pobierzemy jego size właściwość.

Uwaga: GetDrive, GetFolder i GetFile nie są jedynymi metodami wewnątrz FSO, użyłem ich tylko do wyjaśnienia. W poniższej sekcji zobaczymy wszystkie metody zawarte wewnątrz FileSystemObject.

Metody FSO

Poniższa tabela zawiera szczegóły dotyczące różnych metod FileObjectSystem i zadań, które wykonują:

Method Description
GetDrive, GetFolder, and GetFile Metody te służą do pobierania informacji odpowiednio o Drive, Folders i Files.
CreateFolder i CreateTextFile Pomagają w tworzeniu nowych folderów lub plików.
DeleteFile i DeleteFolder Pomagają w usuwaniu istniejących plików lub folderów.
CopyFile i CopyFolder Te metody pomagają w kopiowaniu plików lub folderów z jednej lokalizacji do innej.
MoveFile i MoveFolder Te metody pomagają w przenoszeniu plików lub folderów z jednej lokalizacji do innej.

Tworzenie obiektu FileSystemObject w VBA: W tej sekcji zajmiemy się dwoma rzeczami:

  • Tworzenie referencji do biblioteki Microsoft Scripting Runtime Library, tj. Scrrun.dll
  • Tworzenie obiektu FSO.

Tworzenie referencji biblioteki Microsoft Scripting Runtime Library

Aby utworzyć referencję biblioteki Microsoft Scripting Runtime Library, wykonaj następujące czynności:

  • Przede wszystkim otwórz edytor VBA, naciskając klawisze „Alt + F11”.

  • Następnie przejdź do „Narzędzia” > „Odwołanie”, jak pokazano powyżej.

  • W ten sposób otworzy się okno odwołania. Tutaj wybierz i zaznacz pozycję „Microsoft Scripting Runtime” i kliknij „OK”.
  • Teraz odniesienie do biblioteki Microsoft Scripting Runtime zostało dodane.

Tworzenie obiektu FSO

Tworzenie obiektu FSO jest proste, wykonaj poniższe kroki, aby to zrobić:

  • W edytorze VBA przejdź do „Wstaw”>”Moduł”.

  • Teraz w oknie modułu wpisz „Public FSO As New FileSystemObject„.
  • To utworzy obiekt FileSystemObject o nazwie FSO.

Potem możesz po prostu uzyskać dostęp do metod FileSystemObject za pomocą obiektu FSO.

6 Praktyczne przykłady dostępu do FileSystemObject

Przejdźmy teraz do kilku praktycznych przykładów zastosowania FSO:

Przykład 1: Użyj FSO, aby znaleźć całkowitą wolną przestrzeń dysku.

Poniżej znajduje się kod, który to zrobi:

'Tworzenie obiektu FileSystemObject 
Public FSO As New FileSystemObject
Sub DiskSpace()
Dim drv As Drive
Dim Space As Double
Set drv = FSO.GetDrive("C:") 'tworzenie dysku
object Space = drv.FreeSpace
Space = Space / 1073741824 'przeliczanie bajtów na GB
Space = WorksheetFunction.Round(Space, 2) 'zaokrąglanie
MsgBox "C: has free space = " & Space & " GB"
End Sub

Wyjaśnienie: W tym kodzie najpierw utworzyliśmy obiekt Drive za pomocą metody ’GetDrive’, a następnie użyliśmy jego właściwości ’FreeSpace’ do pobrania wolnego miejsca.

Na koniec wyświetliliśmy wolne miejsce za pomocą okna komunikatu.

Zauważ, że istnieją dwie właściwości do pobierania wolnego miejsca na dysku, tj. drv.FreeSpace i drv.AvailableSpace.

Przykład 2: Sprawdź, czy folder istnieje, czy nie. Jeśli folder nie istnieje, to utwórz ten folder.

Poniżej znajduje się kod:

'Tworzenie obiektu FileSystemObject 
Public FSO As New FileSystemObject
Sub ChkFolder()
Dim Fldr_name As String
Fldr_name = InputBox("Wprowadź ścieżkę folderu do sprawdzenia :")
If Len(Fldr_name) > 0
Then If FSO.FolderExists(Fldr_name) = True Then
MsgBox "Folder Exists!"
Else FSO.CreateFolder(Fldr_name)
MsgBox ("Folder Created!")
End If Else MsgBox "Wrong Input"
End If
End Sub

Wyjaśnienie: W kodzie użyliśmy funkcji InputBox, aby uzyskać ścieżkę folderu od użytkownika. Po tym używając instrukcji If wraz z FolderExistsmetodą, sprawdziliśmy czy ten folder jest obecny czy nie. Jeśli folder nie jest obecny, wtedy tworzymy ten folder używając CreateFolder metody.

Uwaga: CreateFoldermetoda utworzy tylko jeden folder na raz. Tak więc, jeśli dostarczysz argument „C:\Folder1\Folder2\Folder3” do niego, to utworzy on tylko Folder3 wewnątrz Folderu2. Ale jeśli Folder2 nie istnieje, to wyrzuci błąd „path not found”.

Przykład 3: Napisz kod używający FSO do skopiowania folderu z jednej lokalizacji do drugiej.

Poniżej znajduje się kod, który to zrealizuje:

’Tworzenie obiektu FileSystemObject Public FSO As New FileSystemObject Sub CopyFolder() FSO.CopyFolder „C:\Źródło-Folder\”, „D:\Destination-Folder\”, True MsgBox „Kopiowanie wykonane!” End Sub

Wyjaśnienie: W kodzie wykorzystaliśmy CopyFolder metodę FSO, metoda ta przyjmuje trzy argumenty:

  • Source Path
  • Destination path
  • A Boolean argument określający Overwrite Existing.

Przykład 4: Użycie FileSystemObject pobiera katalog Temp, folder System oraz folder Windows.

Aby to zrobić, możemy użyć poniższego kodu:

'Tworzenie obiektu FileSystemObject 
Public FSO As New FileSystemObject
Sub GetFolderpath()
Dim Windows_Fldr As String
Dim System_Fldr As String
Dim Temp_Fldr As String
Windows_Fldr = FSO.GetSpecialFolder(0)
System_Fldr = FSO.GetSpecialFolder(1)
Temp_Fldr = FSO.GetSpecialFolder(2)
MsgBox ("Ścieżka do folderu Windows = " & Windows_Fldr & vbNewLine & _ "Ścieżka do folderu System = " & System_Fldr & vbNewLine & _ "Ścieżka do folderu Temp = " & Temp_Fldr)
End Sub

Wyjaśnienie: W kodzie wykorzystaliśmy GetSpecialFolder metodę FSO, metoda ta przyjmuje jeden argument liczbowy tj. 0-2.

  • FSO.GetSpecialFolder(0) – Pobiera ścieżkę do Folderu Windows.
  • FSO.GetSpecialFolder(1) – Pobiera ścieżkę do Folderu Systemowego.
  • FSO.GetSpecialFolder(2) – Pobiera ścieżkę do Lokalnego folderu tymczasowego.

Przykład 5: Utwórz plik tekstowy, zapisz do niego pewną zawartość, następnie odczytaj plik, a na koniec usuń plik.

Poniżej znajduje się kod, który pozwoli to osiągnąć:

'Creating a FileSystemObject Public 
FSO As New FileSystemObject
Sub CreateFile()
Dim txtstr As TextStream
Dim FileName As String
Dim FileContent As String
Dim File As File
FileName = "C:\TestDirectory\File.txt" 'File to be created
'Tworzenie pliku i zapisywanie do niego zawartości
FileContent = InputBox("Enter the File Content")
If Len(FileContent) > 0 Then
Set txtstr = FSO.CreateTextFile(FileName, True, True)
txtstr.Write FileContent
txtstr.Close
End If
' Odczyt z pliku, który właśnie utworzyliśmy
If FSO.FileExists(FileName) Then
Set File = FSO.GetFile(FileName)
Set txtstr = File.OpenAsTextStream(ForReading, TristateUseDefault)
MsgBox txtstr.ReadAll txtstr.Close
' Finally Usuwanie pliku
File.Delete (True)
End If
End Sub

Wyjaśnienie: Ten kod najpierw tworzy plik tekstowy, dodaje do niego zawartość, następnie odczytuje ją, wyświetla za pomocą okna komunikatów, a na koniec usuwa ten plik.

Przykład 6: Napisz kod VBA, który potrafi iterować po wszystkich plikach obecnych wewnątrz folderu, a także pobiera ich rozmiar i datę modyfikacji.

Następujący kod może wykonać to zadanie:

'Tworzenie obiektu FileSystemObject 
Public FSO As New FileSystemObject
Sub ListFiles()
'Deklarowanie zmiennych
Dim objFolder As Folder
Dim objFile As File
Dim strPath As String
Dim NextRow As Long
'Określenie ścieżki do folderu
strPath = "C:\Users \Pulpit \ExcelTrick \ "
'Utwórz obiekt tego folderu
Set objFolder = FSO.GetFolder(strPath)
'Sprawdź czy folder jest pusty czy nie
If objFolder.Files.Count = 0 Then
MsgBox "No files were found...", vbExclamation
Exit Sub
End If
'Adding Column names for A, B, and C
Cells(1, "A").Value = "File Name"
Cells(1, "B").Value = "Size"
Cells(1, "C").Value = "Modified Date/Time"
'Znajdź następny dostępny wiersz
NextRow = ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row + 1
'Loop through each file in the folder
For Each objFile In objFolder.Files
'List the name, size, and date/time of the current file
Cells(NextRow, 1).Value = objFile.Name
Cells(NextRow, 2).Value = objFile.Size
Cells(NextRow, 3).Value = objFile.DateLastModified
'Znajdź następny wiersz NextRow = NextRow + 1
Next objFile
End Sub

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.