Dateien in Ordner rekursiv umbenennen

Dateien in Ordner und Unterordner durchlaufen und beispielsweise umbenennen.

Mit der folgenden Prozedur kann ein Datei-Ordner durchlaufen werden, um mit allen enthaltenen Dateien eine Aktion austzführen.
Optional mit Unterordnern oder einem Muster, mit dem der Dateiname matchen muss.

Public Function LoopFilesInFolder(strFolder As String, Optional bIncludeSubs As Boolean, Optional ByVal strFilePattern As String = "*") As Boolean
' Loop über alle Dateien in einem Ordner, optional mit Unterordner, um Aktion mit der Datei auszuführen
' - strFolder:      Pfad des Ordners
' - bIncludeSubs:   (optional) Mit Unterordner (-> rekursiver Aufruf)
' - strFilePattern: (optional) Nur Dateien, die dem Muster entsprechen, werden berücksichtigt
Dim objMainfolder As Folder
Dim objSubfolders As Folders
Dim objSubfolder As Folder
Dim objFile As File
  
  ' Fehler, wenn Ordner nicht existiert   
  If Not fso.FolderExists(strFolder) Then
    err.Raise vbObjectError + 1, , "Pfad '" & strFolder & "' nicht gefunden."
  End If
  
  Set objMainfolder = fso.GetFolder(strFolder)
  
  ' Dateien in main folder durchlaufen
  For Each objFile In objMainfolder.Files
    If LCase(objFile.Name) Like LCase(strFilePattern) Then
      If Not ProcessFile(objFile) Then
        Exit Function
      End If
    End If
    DoEvents
  Next
  
  ' Subfolder durchlaufen
  If bIncludeSubs Then
    Set objSubfolders = objMainfolder.subfolders
    For Each objSubfolder In objSubfolders
      If Not LoopFilesInFolder(objSubfolder.Path, True, strFilePattern) Then
        Exit Function
      End If
    Next
  End If
  
  LoopFilesInFolder = True

End Function
FileSystemObject

Vorraussetzung ist die Einbindung der Bibliothek „Microsoft Scripting Runtime“ unter den Verweisen.

Auf Modulebene wird dann ein FileSystemObject deklariert:

' Deklaration auf Modulebene und nicht in LoopFilesInFolder(..), sonst wird das Objekt bei jedem rekursiven Aufruf neu erzeugt
Dim fso As New FileSystemObject

Zu Beginn wird der Fehler abgefangen, wenn der Ordnername nicht existiert.
Dabei soll die Fehlermeldung nicht von der Funktion selbst ausgeworfen werden sondern an die aufrufende Prozedur übergeben werden.

Im folgenden werden alle Dateien im Ordner durchlaufen.
Wenn strFilePattern nicht angegeben wird, dann wird die Variable auf „*“ gesetzt, so dass alle Dateien matchen.
Sonst muss der Ausdruck  LCase(objFile.Name) Like LCase(strFilePattern) zutreffen.
Das LCase() wird verwendet, um sicherzustellen, dass der Like-Vergleich nicht Case-sensitiv ist. Dies wird i.d.R. mit der Option Compare Anweisung erreicht, aber auf diese Weise ist man davon unabhängig.

Dann wird ProcessFile(objFile) aufgerufen. In dieser Funktion kann dann die gewünschte Aktion mit der Datei ausgeführt werden. In diesem Beispiel das Umbenennen der Datei:

Public Function ProcessFile(objFile As File) As Boolean  
On Error GoTo ErrHandle

  If InStr(objFile.Name, "alt") > 0 Then
    objFile.Name = Replace(objFile.Name, "alt", "neu")
  End If
  
  ProcessFile = True
  
Exit Function
ErrHandle:
  
  MsgBox "Fehler bei Datei '" & objFile.Name & "':" & vbCrLf & vbCrLf & err.Description
End Function

Wenn  der Dateiname „alt“ enthält, dann wird „alt“ durch „neu“ ersetzt.

Wenn ein Fehler auftritt (z.B. wenn die umzubenennende Datei geöffnet ist), dann wird eine Fehlermeldung gezeigt. Dadurch, dass alle Prozeduren Funktionen sind, die nur bei Erfolg True zurückgeben, wird erreicht, dass der ganze Prozess abgebrochen wird.

Rekursiver Aufruf

Um zu erreichen, dass Ordner mit Unterordnern in beliebige Tiefe durchlaufen werden, muss die Prozedur rekursiv sich selbst aufrufen. Dazu werden die Unterordner des Ordners durchlaufen und wiederum an LoopFilesInFolder(..) mit den gleichen Parametern übergeben.

 

Dateien in Ordner rekursiv umbenennen
Markiert in:        

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.