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:

  1. Dim fso
  2. Set fso = CreateObject("Scripting.FileSystemObject")

JScript:

  1. 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:

  1. Set fso = Nothing

Pfadfunktionen

Laufwerk bestimmen

VBScript:

  1. sDrive = fso.GetDriveName(sFullPath)

Verzeichnis extrahieren

VBScript:

  1. sDir = fso.GetParentFolderName(sFullPath)

Dateiname extrahieren

Ermittelt Dateinamen mit Dateiendung

VBScript:

  1. sFileName = fso.GetFileName(sFullPath)

Basisnamen extrahieren

Ermittelt Dateinamen, jedoch ohne Dateityp

VBScript:

  1. sBaseName = fso.GetBaseName(sFullPath)

Erweiterung extrahieren

Ermittelt Dateiendung/-typ

VBScript:

  1. sExt = fso.GetExtensionName(sFullPath)

Pfade kombinieren

Setzt zwei Teilpfade zu einem kompletten Pfad zusammen

VBScript:

  1. 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:

  1. sGuiltyPath = fso.GetAbsolutePathName(sAskPath)

Temp-Verzeichnis ermitteln

Wird oft benötigt: Das temporäre Computerverzeichnis

  1. 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:

  1. Set oDrive = fso.GetDrive(fso.GetDriveName(sFullPath))

Verfügbare Laufwerke ermittelt

(Laufwerke, die nicht bereit sind, werden nicht aufgeführt)

VBScript:

  1. 'Liefert aktuell verfügbare(!) Laufwerke
  2. Public Function ListReadyDrives
  3. Dim oFS
  4. Dim oDrives
  5. Dim oDrive
  6.  
  7. Dim sResult
  8.  
  9. 'Objekte holen
  10. Set oFS = CreateObject("Scripting.FileSystemObject")
  11. Set oDrives = fso.Drives
  12.  
  13. For Each oDrive in dc
  14. If oDrive.IsReady Then sResult = sResult & ";" & oDrive.DriveLetter & ": (" & DriveType(oDrive) & ")"
  15. Next
  16. Set oDrives = Nothing
  17. Set oFS = Nothing
  18.  
  19. ListReadyDrives = Split(Mid(sResult, 2), ";")
  20. End Function
  21.  
  22. 'Liefert einen Laufwerkstyp als Klartext
  23. Public Function DriveType(ByVal oDrive)
  24. Select Case oDrive.DriveType
  25. Case 0
  26. DriveType = "Unbekannt"
  27. Case 1
  28. DriveType = "Wechseldatenträger"
  29. Case 2
  30. DriveType = "Festplatte"
  31. Case 3
  32. DriveType = "Netzwerk"
  33. Case 4
  34. DriveType = "CD/DVD-ROM"
  35. Case 5
  36. DriveType = "RAM-Laufwerk"
  37. Case Else
  38. DriveType = "Unbekannter Typ"
  39. End Select
  40. End Function

Laufwerksbereitschaft ermitteln

VBScript:

  1. Set oDrive = fso.GetDrive(fso.GetDriveName(sFullPath))
  2. If oDrive.IsReady Then
  3. '...
  4.  
  5. End If
  6. Set oDrive = Nothing

Freien Speicherplatz ermitteln

VBScript:

  1. '...
  2. Dim oDrive
  3. Set oDrive = fso.GetDrive(fso.GetDriveName(sFullPath))
  4. MsgBox FormatBytes(oDrive.FreeSpace) & vbCRLF & FormatBytes(oDrive.AvailableSpace)
  5.  
  6. 'Formatiert Größe von Bytes in lesbare Form mit Vorsätzen
  7. Function FormatBytes(ByVal Value)
  8. Dim sBenennung
  9.  
  10. If IsNumeric(Value) Then
  11. sBenennung = " B"
  12. If Value >= 1024 Then
  13. Value = Value / 1024
  14. sBenennung = " KB"
  15. End If
  16. If Value >= 1024 Then
  17. Value = Value / 1024
  18. sBenennung = " MB"
  19. End If
  20. If Value >= 1024 Then
  21. Value = Value / 1024
  22. sBenennung = " GB"
  23. End If
  24. FormatBytes = FormatNumber(Value, 2, -1) & sBenennung
  25. Else
  26. FormatBytes = "Formatierung nicht möglich!"
  27. End If
  28. End Function

Verzeichnisfunktionen

Eines der Hauptfunktionen ist: Ist ein Verzeichnis vorhanden

VBScript:

  1. If fso.FolderExists(sFolderPath) Then
  2. 'Code, wenn Verzeichnis da ist
  3. '...
  4. Else
  5. MsgBox "Verzeichnis fehlt!", vbExclamation
  6. 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:

  1. Dim oFolder
  2. Set oFolder = fso.GetFolder(sFolderPath)

Zerstören

VBScript:

  1. Set oFolder = Nothing

Erzeugen

VBScript:

  1. if not fso.FolderExists(sFolderPath) then
  2. fso.CreateFolder(sFolderPath)
  3. 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:

  1. Set ofolders = fso.getfolder(C:\test\")
  2. Set osubfolder = ofolders.Subfolders
  3. For Each VerzX in osubfolder
  4. Msgbox VerzX.Name
  5. Next
  6. set osubfolder = nothing
  7. set ofolders = nothing

Rekursives Einlesen von Dateien mit Filterkriterien, optional inkl. Unterverzeichnisse

VBScript:

  1. 'Stand: 27.01.2011
  2. Option Explicit
  3.  
  4. Main
  5.  
  6. Sub Main
  7. MsgBox Join(ReadAllFiles(FF_EnterPath(False, "Verzeichnis auswählen"), "*.jpg;*.tif;*.png;*.bmp;*.jp2", True), vbCRLF)
  8. End Sub
  9.  
  10. 'Liest alle Dateien ein, die den Kriterien entsprechen
  11. 'Parameter:
  12. 'sPath: Vollständiger Ursprungspfad
  13. 'sFilter: Dateifilter. Zugelassene Filterzeichen: "*". Mehrere Filter werden mit Semikolon ";" getrennt
  14. 'bRecursive: True = Durchsucht auch Unterverzeichnisse
  15. Public Function ReadAllFiles(sPath, sFilter, bRecursive)
  16. Dim oFolderClass
  17. Set oFolderClass = New clsFolder
  18. With oFolderClass
  19. .FileFilter = sFilter
  20. ReadAllFiles = .GetFiles(sPath, bRecursive)
  21. End With
  22. Set oFolderClass = Nothing
  23. End Function
  24.  
  25. '::::::::::::::::::::::::::::::::::::::::::
  26. Class clsFolder
  27. '::::::::::::::::::::::::::::::::::::::::::
  28. Private mv_fso
  29. Private mv_Filter
  30. Public FileTypes
  31.  
  32. Private Sub Class_Initialize()
  33. Set mv_fso = CreateObject("Scripting.FileSystemObject")
  34. mv_Filter = Array("*.*")
  35. End Sub
  36. Private Sub Class_Terminate()
  37. Set mv_fso = Nothing
  38. Erase mv_Filter
  39. End Sub
  40.  
  41. ' Eigenschaft: Filter
  42. ' Zulässige Filterzeichen: *
  43. ' Mehrere Definitionen werden mit Semikolon ";" getrennt
  44. Public Property Let FileFilter(ByVal sValue)
  45. Dim i
  46.  
  47. If Len(sValue) = 0 Then
  48. mv_Filter = Array("*.*")
  49. Else
  50. mv_Filter = Split(Trim(sValue), ";")
  51. For i = 0 To UBound(mv_Filter, 1)
  52. mv_Filter(i) = Trim(mv_Filter(i))
  53. Next
  54. End If
  55. End Property
  56. Public Property Get FileFilter()
  57. FileFilter = Join(mv_Filter, ";")
  58. End Property
  59.  
  60. 'Testet Dateinamen, ob sie dem Dateifilter entsprechen
  61. Public Function TestFilter(sFilePath)
  62. Dim sName
  63. Dim aSplit
  64. Dim i
  65. Dim lUBound
  66. Dim lPos
  67. Dim sFilter
  68.  
  69. Dim bStartFilter
  70.  
  71. TestFilter = False
  72.  
  73. sName = mv_fso.GetFileName(sFilePath)
  74.  
  75. For Each sFilter In mv_Filter
  76. If Len(sFilter) > 0 Then
  77. aSplit = Split(sFilter, "*")
  78. lUBound = UBound(aSplit, 1)
  79. lPos = 1
  80. For i = 0 To lUBound
  81. Select Case True
  82. Case CBool((i = 0) And (Len(aSplit(0)) = 0))
  83. Case CBool((i = lUBound) And (Len(aSplit(lUBound)) = 0))
  84. TestFilter = True
  85. Exit Function
  86. Case Len(aSplit(i)) = 0
  87. Case Else
  88. lPos = InStr(lPos, sName, aSplit(i), vbTextCompare)
  89. If CBool((i = 0) And (lPos <> 1)) Then Exit For
  90. If lPos = 0 Then Exit For
  91.  
  92. lPos = lPos + Len(aSplit(i))
  93. End Select
  94. Next
  95. If lPos >= Len(sName) Then
  96. TestFilter = True
  97. Exit Function
  98. End If
  99. End If
  100. Next
  101. End Function
  102.  
  103. ' Holt alle Dateien aus dem angegebenen Verzeichnis
  104. ' Parameter:
  105. ' sPath: Vollständiger Verzeichnispfad
  106. ' bRecursive: Gibt an, dass auch Unterverzeichnisse des Pfades durchsucht werden sollen
  107. Public Function GetFiles(ByVal sPath, ByVal bRecursive)
  108. Dim aFiles
  109. aFiles = Array()
  110. If Not mv_fso.FolderExists(sPath) Then
  111. GetFiles = aFiles
  112. Exit Function
  113. End If
  114.  
  115. RecGetFiles sPath, bRecursive, aFiles
  116.  
  117. GetFiles = aFiles
  118. End Function
  119.  
  120. 'Hilfsmethode zur rekursiven Durchsuchung
  121. Private Sub RecGetFiles(ByRef sPath, ByVal bRecursive, ByRef aFiles)
  122. Dim oFolder
  123. Dim oSubFolder
  124. Dim oFile
  125. Set oFolder = mv_fso.GetFolder(sPath)
  126.  
  127. For Each oFile in oFolder.Files
  128. If TestFilter(oFile.Path) Then
  129. ReDim Preserve aFiles(UBound(aFiles, 1) + 1)
  130. aFiles(UBound(aFiles, 1)) = oFile.Path
  131. End If
  132. Next
  133. If bRecursive Then
  134. For Each oSubFolder in oFolder.SubFolders
  135. RecGetFiles oSubFolder.Path, bRecursive, aFiles
  136. Next
  137. End If
  138. End Sub
  139.  
  140. '::::::::::::::::::::::::::::::::::::::::::
  141. End Class
  142. '::::::::::::::::::::::::::::::::::::::::::

Dateifunktionen

Das wichtigste überhaupt ist; festzustellen, ob eine Datei vorhanden ist:

VBScript:

  1. If fso.FileExists(sFile) Then
  2. 'Code, wenn Datei da ist
  3. '...
  4. Else
  5. MsgBox "Datei fehlt!", vbExclamation
  6. 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:

  1. Dim oFile
  2. Set oFile = fso.GetFile(sFileFullPath)

Zerstören

VBScript:

  1. Set oFile = Nothing

Dateigröße ermitteln:

VBScript:

  1. Option Explicit
  2.  
  3. Dim fso
  4.  
  5. Main
  6.  
  7. Set fso = Nothing
  8.  
  9. Sub Main
  10. Dim oFile
  11. Dim sFile
  12.  
  13. If FF_GetImageCount = 0 Then Exit Sub
  14.  
  15. Set fso = CreateObject("Scripting.FileSystemObject")
  16. sFile = FF_GetImageName(0)
  17.  
  18. Set oFile = fso.GetFile(sFile)
  19.  
  20. MsgBox sFile & ": " & oFile.Size & " Bytes"
  21.  
  22. Set oFile = Nothing
  23. 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:

  1. 'Attribute
  2.  
  3. Option Explicit
  4.  
  5. Dim fso
  6.  
  7. '0=Normal Normale Datei. Es sind keine Attribute gesetzt.
  8. '1=ReadOnly Schreibgeschützte Datei. Für das Attribut gilt Lesen/Schreiben.
  9. '2=Hidden Versteckte Datei. Für das Attribut gilt Lesen/Schreiben.
  10. '4=System Systemdatei. Für das Attribut gilt Lesen/Schreiben.
  11. '8=Volume Datenträgerbezeichnung eines Laufwerkes. Das Attribut ist schreibgeschützt.
  12. '16=Directory Ordner oder Verzeichnis. Das Attribut ist schreibgeschützt.
  13. '32=Archive Datei hat sich nach der letzten Sicherung geändert. Für das Attribut gilt Lesen/Schreiben.
  14. '64=Alias Verknüpfung oder Shortcut. Das Attribut ist schreibgeschützt.
  15. '128=Compressed Komprimierte Datei. Das Attribut ist schreibgeschützt.
  16.  
  17. Main
  18.  
  19. Set fso = Nothing
  20.  
  21. Sub Main
  22. Dim sFile
  23. Dim oFile
  24. Dim lAttributes
  25.  
  26. sFile = FF_GetImageName(0)
  27. If Len(sFile) = 0 Then Exit Sub
  28.  
  29. Set fso = CreateObject("Scripting.FileSystemObject")
  30.  
  31. Set oFile = fso.GetFile(sFile)
  32. lAttributes = oFile.Attributes
  33.  
  34. 'ReadOnly löschen
  35. lAttributes = (Not (Not lAttributes Or 1))
  36. 'Hidden löschen
  37. lAttributes = (Not (Not lAttributes Or 2))
  38. 'Archive setzen
  39. lAttributes = lAttributes Or 32
  40.  
  41. oFile.Attributes = lAttributes
  42.  
  43. Set oFile = Nothing
  44. End Sub

Prüfen, ob Datei existiert

VBScript:

  1. Function FileExists(ByVal uFileName)
  2. Dim fso
  3. Set fso = CreateObject("Scripting.FileSystemObject")
  4. FileExists = fso.FileExists(uFileName)
  5. Set fso = Nothing
  6. 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:

  1. Option Explicit
  2.  
  3. Dim fso
  4.  
  5. Main
  6.  
  7. Set fso = Nothing
  8.  
  9. Sub Main
  10. Dim oFile
  11. Dim sFile
  12.  
  13. If FF_GetImageCount = 0 Then Exit Sub
  14.  
  15. Set fso = CreateObject("Scripting.FileSystemObject")
  16. sFile = FF_GetImageName(0)
  17.  
  18. Set oFile = fso.GetFile(sFile)
  19.  
  20. MsgBox "Letzte Änderung von """ & sFile & """: " & oFile.DateLastModified
  21.  
  22. Set oFile = Nothing
  23. End Sub