Die ab Visual Basic 6 standardmäßig zur Verfügung stehende
Scripting-Komponente erlaubt einen komfortablen Umgang mit Ordnern
und Dateien und bietet bequeme Dateioperationen. Während das
Verschieben eines kompletten Ordners samt Unterordnern und Dateien
zwar auch mit der Visual Basic-Anweisung Name erreicht werden kann,
gibt es keine entsprechende Anweisung zum vollständigen Kopieren
eines Ordners samt Inhalt. Das FileSystemObject oder das
Folder-Objekt der Scripting-Komponente bieten dagegen diese
Möglichkeit.
Jedoch bieten weder diese Scripting-Objekte noch VB noch das
Windows-API die Möglichkeit, eine Ordner-Struktur zwar komplett,
aber ohne die darin enthaltenen Dateien zu kopieren.
Mit der hier vorgestellten Prozedur CopyFolders können Sie auch
diese Aufgabe lösen, neben dem standardmäßigen Kopieren eines
Ordners inklusive Unterordnern und Dateien. Darüber hinaus bietet
sie sogar die Möglichkeit, statt die vorhandenen Dateien
vollständig zu kopieren, nur leere Dateien mit gleichem Namen und
gleicher Dateierweiterung in den Zielordnern anzulegen (auf diese
Möglichkeit bin ich kürzlich angesprochen worden - daher habe ich
sie einfach mal mit eingebaut, auch wenn ich keinen sinnvollen
Verwendungszweck sehe...).
Sie übergeben der Prozedur den Quellpfad und den Zielpfad und
geben gegebenenfalls im optionalen Parameter CopyMode an, ob der
Ordner eins zu eins mit allem Inhalt (cfCopyFiles aus der
Enumeration CopyFoldersConstants, Voreinstellung) oder nur die leere
Ordner-Struktur (cfFolderStructureOnly) kopiert werden soll, oder ob
die Ordner-Struktur kopiert und leere Dateien angelegt werden
sollen. Im letzten optionalen Parameter Overwrite geben Sie an, ob
gegebenenfalls bereits vorhandene Ordner und Dateien überschrieben
werden sollen.
Das komplette Kopieren erledigt die Prozedur selbst. Interessant
ist hier vielleicht die Verwendung des Imp-Operators
zur Entscheidung, ob bei der Angabe von Overwrite gleich True der
Ordner kopiert werden soll. Dazu wird das Ergebnis der Prüfung, ob
der Ordner bereits existiert, über den Imp-Operater mit der
Overwrite-Angabe verknüpft. Entsprechend der Wahrheitstabelle
dieses Operators wird de Kopie nur dann nicht ausgeführt, wenn der
Ordner bereits existiert und die Anweisung zum Überschreiben per
Overwrite nicht erfolgt ist.
Soll die leere Ordnerstruktur kopiert werden und sollen
gegebenenfalls die leeren Dateien angelegt werden, wird die private
Hilfsprozedur zCopyFolders rekursiv aufgerufen - für den
Startordner und für jeden seiner Unterordner (SubFolders-Collection
des Folder-Objekts) - und wiederum für die Unterordner der
Unterordner usw. Dort wird dann jeweils ein neuer Ordner in der
jeweiligen Position neu angelegt. Die Frage nach dem Überschreiben
kann hier entfallen - lediglich ein bereits vorhandener Ordner
braucht ja nicht neu angelegt zu werden. Sollen auch die leeren
Dateien angelegt werden, erfolgt das für jeden Ordner anschließend
nach dem Lauf durch die SubFolders-Collection. Auch hier wird wieder
die Prüfung der Existenz einer Datei über den Imp-Operator mit der
Overwrite-Angabe verknüpft, bevor die leere Datei angelegt wird.
Public Enum CopyFoldersConstants
cfCopyFiles
cfFolderStructureOnly
cfCreateFiles
End Enum
Public Sub CopyFolders(SourcePath As String, _
DestPath As String, _
Optional ByVal CopyMode As CopyFoldersConstants = cfCopyFiles, _
Optional ByVal Overwrite As Boolean)
Dim nFSO As FileSystemObject
Dim nDestPath As String
Set nFSO = New FileSystemObject
If CopyMode = cfCopyFiles Then
With nFSO
nDestPath = .BuildPath(DestPath, .GetBaseName(SourcePath))
If .FolderExists(nDestPath) Imp Overwrite Then
.CopyFolder SourcePath, nDestPath, Overwrite
End If
End With
Else
zCopyFolders nFSO.GetFolder(SourcePath), DestPath, nFSO, _
CBool(CopyMode = cfCreateFiles), Overwrite
End If
End Sub
Private Sub zCopyFolders(SourceFolder As Folder, _
DestPath As String, FSO As FileSystemObject, _
ByVal CreateFiles As Boolean, ByVal Overwrite As Boolean)
Dim nDestFolder As Folder
Dim nDestPath As String
Dim nSubFolder As Folder
Dim nFile As File
Dim nFileName As String
With FSO
nDestPath = .BuildPath(DestPath, SourceFolder.Name)
If Not .FolderExists(nDestPath) Then
Set nDestFolder = .CreateFolder(nDestPath)
End If
For Each nSubFolder In SourceFolder.SubFolders
zCopyFolders nSubFolder, nDestPath, FSO, CreateFiles, _
Overwrite
Next
If CreateFiles Then
For Each nFile In SourceFolder.Files
nFileName = .BuildPath(nDestPath, nFile.Name)
If .FileExists(nFileName) Imp Overwrite Then
.CreateTextFile nFileName, Overwrite
End If
Next
End If
End With
End Sub
Beachten Sie bitte, dass Sie zur Verwendung dieses Moduls einen
Verweis auf die Scripting-Komponente (SCRRUN.DLL) in Ihr Projekt
einbinden müssen. Wenn Sie die Objekte dieser Komponente noch nicht
näher kennen sollten, erforschen Sie doch diese einmal im
Objekt-Katalog - die Dokumentation zu jedem Objekt, jeder Methode
und Eigenschaft ist jeweils nur einen F1-Tastendruck weit
entfernt...
|