meta data for this page
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
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 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 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