===== 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%C3%BCst%20%28VBScript%29|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 [[/Hilfe%20zu%20JS%20und%20VBS|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
//VBScript://
 
  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 [[/Hilfe%20zu%20JS%20und%20VBS|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: 
//VBScript://
  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 [[/Hilfe%20zu%20JS%20und%20VBS|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