FileSystemObject | Definieren | Zerstören | Pfadfunktionen | Laufwerksfunktionen | Verzeichnisfunktionen | Dateifunktionen

FileSystemObject

Eins der wichtigsten Objekte für Skripte. Es ist das Standardobjekt in fast jedem Skript. Daher wird der Zugriff meist aus Performance-Gründen global definiert.
Hilfreiche Zusammenstellung von Skriptbeispielen: http://www.oc-s.com/tutorials/WSH/filesystemobject.htm

Definieren

VBScript:
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
JScript:
var fso = new ActiveXObject("Scripting.FileSystemObject");

Zerstören

Es empfiehlt sich Objekte bei Beendigung frei zu geben. Da es meist global definiert wird, sollte gewährleistet sein, dass bei Programmbeendigung das Objekt frei gegeben wird. Beispiel siehe: Scriptgerüst (VBScript)
VBScript:
Set fso = Nothing

Pfadfunktionen

Laufwerk bestimmen

VBScript:
sDrive = fso.GetDriveName(sFullPath)

Verzeichnis extrahieren

VBScript:
sDir = fso.GetParentFolderName(sFullPath)

Dateiname extrahieren

Ermittelt Dateinamen mit Dateiendung
VBScript:
sFileName = fso.GetFileName(sFullPath)

Basisnamen extrahieren

Ermittelt Dateinamen, jedoch ohne Dateityp
VBScript:
sBaseName = fso.GetBaseName(sFullPath)

Erweiterung extrahieren

Ermittelt Dateiendung/-typ
VBScript:
sExt = fso.GetExtensionName(sFullPath)

Pfade kombinieren

Setzt zwei Teilpfade zu einem kompletten Pfad zusammen
VBScript:
sResultPath = fso.BuildPath(sDir, sFileName)

Absoluten Pfad ermitteln

Wird benötigt um einen absoluten Pfad zu konsolidieren. Zu weiteren Handhabung siehe die VBScript-Hilfe
VBScript:
sGuiltyPath = fso.GetAbsolutePathName(sAskPath)

Temp-Verzeichnis ermitteln

Wird oft benötigt: Das temporäre Computerverzeichnis
sTempPath = fso.GetSpecialFolder(2)

Laufwerksfunktionen

Hiermit kann ermittelt werden, welche Laufwerke es gibt, ob ein Laufwerk verfügbar ist, freien Speicherplatz etc. Hier kann nur ein grober Abriss der Möglichkeiten aufgezeigt werden. Siehe Drive-Objekt in der WSH-Hilfe

Laufwerksobjekt erstellen

VBScript:
Set oDrive = fso.GetDrive(fso.GetDriveName(sFullPath))

Verfügbare Laufwerke ermittelt

(Laufwerke, die nicht bereit sind, werden nicht aufgeführt)
VBScript:
'Liefert aktuell verfügbare(!) Laufwerke
Public Function ListReadyDrives
 Dim oFS
 Dim oDrives
 Dim oDrive
 
 Dim sResult
 
 'Objekte holen
 Set oFS = CreateObject("Scripting.FileSystemObject")
 Set oDrives = fso.Drives
 
 For Each oDrive in dc
 If oDrive.IsReady Then sResult = sResult & ";" & oDrive.DriveLetter & ": (" & DriveType(oDrive) & ")"
 Next
 Set oDrives = Nothing
 Set oFS = Nothing
 
 ListReadyDrives = Split(Mid(sResult, 2), ";")
End Function
 
'Liefert einen Laufwerkstyp als Klartext
Public Function DriveType(ByVal oDrive)
 Select Case oDrive.DriveType
 Case 0
 DriveType = "Unbekannt"
 Case 1
 DriveType = "Wechseldatenträger"
 Case 2
 DriveType = "Festplatte"
 Case 3
 DriveType = "Netzwerk"
 Case 4
 DriveType = "CD/DVD-ROM"
 Case 5
 DriveType = "RAM-Laufwerk"
 Case Else
 DriveType = "Unbekannter Typ"
 End Select
End Function

Laufwerksbereitschaft ermitteln

VBScript:
Set oDrive = fso.GetDrive(fso.GetDriveName(sFullPath))
If oDrive.IsReady Then
'...

End If
Set oDrive = Nothing

Freien Speicherplatz ermitteln

VBScript:
'...
Dim oDrive
Set oDrive = fso.GetDrive(fso.GetDriveName(sFullPath))
MsgBox FormatBytes(oDrive.FreeSpace) & vbCRLF & FormatBytes(oDrive.AvailableSpace)
 
'Formatiert Größe von Bytes in lesbare Form mit Vorsätzen
Function FormatBytes(ByVal Value)
 Dim sBenennung
 
 If IsNumeric(Value) Then
 sBenennung = " B"
 If Value >= 1024 Then
 Value = Value / 1024
 sBenennung = " KB"
 End If
 If Value >= 1024 Then
 Value = Value / 1024
 sBenennung = " MB"
 End If
 If Value >= 1024 Then
 Value = Value / 1024
 sBenennung = " GB"
 End If
 FormatBytes = FormatNumber(Value, 2, -1) & sBenennung
 Else
 FormatBytes = "Formatierung nicht möglich!"
 End If
End Function

Verzeichnisfunktionen

Eines der Hauptfunktionen ist: Ist ein Verzeichnis vorhanden
If fso.FolderExists(sFolderPath) Then
    'Code, wenn Verzeichnis da ist
    '...
Else
    MsgBox "Verzeichnis fehlt!", vbExclamation
End If

Folder-Objekt

Das Folder-Objekt liefert die verschiedensten Verzeichniseigenschaften und Methoden. Man kann damit Verzeichnis-Attribute, Zeiteigenschaften, Pfadeigenschaften lesen und schreiben. Oder man kann Unterverzeichnisse oder im Verzeichnis enthaltene Dateien ermitteln, das angesprochene Verzeichnis kopieren, löschen oder verschieben. Hier sollen nur einige wesentliche Eigenschaften oder Methoden aufgeführt werden, um die enorme Leistungsfähigkeit zu zeigen. Für die umfangreiche Hilfe siehe die WSH-Scripthilfe. Die folgenden Beispiele beruhen auf dem Folder-Objekt.

Definieren

VBScript:
Dim oFolder
Set oFolder = fso.GetFolder(sFolderPath)

Zerstören

VBScript:
Set oFolder = Nothing

Erzeugen

VBScript:
if not fso.FolderExists(sFolderPath) then
    fso.CreateFolder(sFolderPath)
end if
Es kann nur ein Ordner angelegt werden, dessen übergeordnete Ordner bereits vorhanden ist. Sonst erfolgt eine Fehlermeldung.

Ermittlung aller Unterordner in einem Ordner

VBScript:
Set ofolders = fso.getfolder(C:\test\")
Set osubfolder = ofolders.Subfolders
For Each VerzX in osubfolder
    Msgbox VerzX.Name
Next
set osubfolder = nothing
set ofolders = nothing

Rekursives Einlesen von Dateien mit Filterkriterien, optional inkl. Unterverzeichnisse

VBScript:
'Stand: 27.01.2011
Option Explicit
 
Main
 
Sub Main
 MsgBox Join(ReadAllFiles(FF_EnterPath(False, "Verzeichnis auswählen"), "*.jpg;*.tif;*.png;*.bmp;*.jp2", True), vbCRLF)
End Sub
 
'Liest alle Dateien ein, die den Kriterien entsprechen
'Parameter:
'sPath: Vollständiger Ursprungspfad
'sFilter: Dateifilter. Zugelassene Filterzeichen: "*". Mehrere Filter werden mit Semikolon ";" getrennt
'bRecursive: True = Durchsucht auch Unterverzeichnisse
Public Function ReadAllFiles(sPath, sFilter, bRecursive)
 Dim oFolderClass
 Set oFolderClass = New clsFolder
 With oFolderClass
 .FileFilter = sFilter
 ReadAllFiles = .GetFiles(sPath, bRecursive)
 End With
 Set oFolderClass = Nothing
End Function
 
'::::::::::::::::::::::::::::::::::::::::::
Class clsFolder
'::::::::::::::::::::::::::::::::::::::::::
 Private mv_fso
 Private mv_Filter
 Public FileTypes
 
 Private Sub Class_Initialize()
 Set mv_fso = CreateObject("Scripting.FileSystemObject")
 mv_Filter = Array("*.*")
 End Sub
 Private Sub Class_Terminate()
 Set mv_fso = Nothing
 Erase mv_Filter
 End Sub
 
 ' Eigenschaft: Filter
 ' Zulässige Filterzeichen: *
 ' Mehrere Definitionen werden mit Semikolon ";" getrennt
 Public Property Let FileFilter(ByVal sValue)
 Dim i
 
 If Len(sValue) = 0 Then
 mv_Filter = Array("*.*")
 Else
 mv_Filter = Split(Trim(sValue), ";")
 For i = 0 To UBound(mv_Filter, 1)
 mv_Filter(i) = Trim(mv_Filter(i))
 Next
 End If
 End Property
 Public Property Get FileFilter()
 FileFilter = Join(mv_Filter, ";")
 End Property
 
 'Testet Dateinamen, ob sie dem Dateifilter entsprechen
 Public Function TestFilter(sFilePath)
 Dim sName
 Dim aSplit
 Dim i
 Dim lUBound
 Dim lPos
 Dim sFilter
 
 Dim bStartFilter
 
 TestFilter = False
 
 sName = mv_fso.GetFileName(sFilePath)
 
 For Each sFilter In mv_Filter
 If Len(sFilter) > 0 Then
 aSplit = Split(sFilter, "*")
 lUBound = UBound(aSplit, 1)
 lPos = 1
 For i = 0 To lUBound
 Select Case True
 Case CBool((i = 0) And (Len(aSplit(0)) = 0))
 Case CBool((i = lUBound) And (Len(aSplit(lUBound)) = 0))
 TestFilter = True
 Exit Function
 Case Len(aSplit(i)) = 0
 Case Else
 lPos = InStr(lPos, sName, aSplit(i), vbTextCompare)
 If CBool((i = 0) And (lPos <> 1)) Then Exit For
 If lPos = 0 Then Exit For
 
 lPos = lPos + Len(aSplit(i))
 End Select
 Next
 If lPos >= Len(sName) Then
 TestFilter = True
 Exit Function
 End If
 End If
 Next
 End Function
 
 ' Holt alle Dateien aus dem angegebenen Verzeichnis
 ' Parameter:
 ' sPath: Vollständiger Verzeichnispfad
 ' bRecursive: Gibt an, dass auch Unterverzeichnisse des Pfades durchsucht werden sollen
 Public Function GetFiles(ByVal sPath, ByVal bRecursive)
 Dim aFiles
 aFiles = Array()
 If Not mv_fso.FolderExists(sPath) Then
 GetFiles = aFiles
 Exit Function
 End If
 
 RecGetFiles sPath, bRecursive, aFiles
 
 GetFiles = aFiles
 End Function
 
 'Hilfsmethode zur rekursiven Durchsuchung
 Private Sub RecGetFiles(ByRef sPath, ByVal bRecursive, ByRef aFiles)
 Dim oFolder
 Dim oSubFolder
 Dim oFile
 Set oFolder = mv_fso.GetFolder(sPath)
 
 For Each oFile in oFolder.Files
 If TestFilter(oFile.Path) Then
 ReDim Preserve aFiles(UBound(aFiles, 1) + 1)
 aFiles(UBound(aFiles, 1)) = oFile.Path
 End If
 Next
 If bRecursive Then
 For Each oSubFolder in oFolder.SubFolders
 RecGetFiles oSubFolder.Path, bRecursive, aFiles
 Next
 End If
 End Sub
 
'::::::::::::::::::::::::::::::::::::::::::
End Class
'::::::::::::::::::::::::::::::::::::::::::

Dateifunktionen

Das wichtigste überhaupt ist; festzustellen, ob eine Datei vorhanden ist:
If fso.FileExists(sFile) Then
    'Code, wenn Datei da ist
    '...
Else
    MsgBox "Datei fehlt!", vbExclamation
End If

File-Objekt

Das File-Objekt liefert die verschiedensten Dateieigenschaften und Methoden. Man kann damit Datei-Attribute, Zeiteigenschaften, Pfadeigenschaften lesen und schreiben. Es ist auch eine Möglicheit Dateien zu verschieben, kopieren oder zu löschen. Für die umfangreiche Hilfe siehe die WSH-Scripthilfe. Die folgenden Beispiele beruhen auf dem File-Objekt.

Definieren

VBScript:
Dim oFile
Set oFile = fso.GetFile(sFileFullPath)

Zerstören

VBScript:
Set oFile = Nothing

Dateigröße ermitteln:

VBScript:
Option Explicit
 
Dim fso
 
Main
 
Set fso = Nothing
 
Sub Main
    Dim oFile
    Dim sFile
 
    If FF_GetImageCount = 0 Then Exit Sub
 
    Set fso = CreateObject("Scripting.FileSystemObject")
    sFile = FF_GetImageName(0)
 
    Set oFile = fso.GetFile(sFile)
 
    MsgBox sFile & ": " & oFile.Size & " Bytes"
 
    Set oFile = Nothing
End Sub

Dateiattribute lesen/setzen:

Dieses Beispiel löscht die Attribute "ReadOnly" und "Hidden" und setzt das Attribute "Archive", damit es vom Backup erneut erfasst wird.
VBScript:
'Attribute

Option Explicit
 
Dim fso
 
'0=Normal        Normale Datei. Es sind keine Attribute gesetzt.
'1=ReadOnly      Schreibgeschützte Datei. Für das Attribut gilt Lesen/Schreiben.
'2=Hidden        Versteckte Datei. Für das Attribut gilt Lesen/Schreiben.
'4=System        Systemdatei. Für das Attribut gilt Lesen/Schreiben.
'8=Volume        Datenträgerbezeichnung eines Laufwerkes. Das Attribut ist schreibgeschützt.
'16=Directory    Ordner oder Verzeichnis. Das Attribut ist schreibgeschützt.
'32=Archive      Datei hat sich nach der letzten Sicherung geändert. Für das Attribut gilt Lesen/Schreiben.
'64=Alias        Verknüpfung oder Shortcut. Das Attribut ist schreibgeschützt.
'128=Compressed  Komprimierte Datei. Das Attribut ist schreibgeschützt.

Main
 
Set fso = Nothing
 
Sub Main
    Dim sFile
    Dim oFile
    Dim lAttributes
 
    sFile = FF_GetImageName(0)
    If Len(sFile) = 0 Then Exit Sub
 
    Set fso = CreateObject("Scripting.FileSystemObject")
 
    Set oFile = fso.GetFile(sFile)
    lAttributes = oFile.Attributes
 
    'ReadOnly löschen
    lAttributes = (Not (Not lAttributes Or 1))
    'Hidden löschen
    lAttributes = (Not (Not lAttributes Or 2))
    'Archive setzen
    lAttributes = lAttributes Or 32
 
    oFile.Attributes = lAttributes
 
    Set oFile = Nothing
End Sub

Prüfen, ob Datei existiert

VBScript:
Function FileExists(ByVal uFileName)
    Dim fso
    Set fso = CreateObject("Scripting.FileSystemObject")
    FileExists = fso.FileExists(uFileName)
    Set fso = Nothing
End Function

Letzten Schreibzugriff ermitteln

Manchmal ist es nötig zu ermitteln, wann eine Datei das letztemal geschrieben wurde. Das ist z. B. bei Kopiervorgängen wichtig, um festzustellen, welche Datei neuer ist.
VBScript:
Option Explicit
 
Dim fso
 
Main
 
Set fso = Nothing
 
Sub Main
    Dim oFile
    Dim sFile
 
    If FF_GetImageCount = 0 Then Exit Sub
 
    Set fso = CreateObject("Scripting.FileSystemObject")
    sFile = FF_GetImageName(0)
 
    Set oFile = fso.GetFile(sFile)
 
    MsgBox "Letzte Änderung von """ & sFile & """: " & oFile.DateLastModified
 
    Set oFile = Nothing
End Sub