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