===== 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