|
Sicher haben Sie schon Anwendungen gesehen, die von veränderten
Dokumenten, Arbeitsdateien oder Konfigurationsdateien usw. nicht nur
den jeweils letzten Zustand als Backup-Datei ablegen, sondern
durchnummerierte Versionen bis zu einer bestimmten maximalen Anzahl.
Und erst wenn diese maximale Anzahl überschritten wird, wird die
jeweils älteste Version überschrieben. Dabei wird meistens die
(üblicherweise drei Zeichen lange) Dateierweiterung durch die
Versionsnummer ersetzt: Datei.001, Datei.002, Datei.003, ... ,
Datei.[max].
Mit Hilfe der Datei-Funktionen des FileSystemObjects
aus der Microsoft Scripting Runtime (seit Visual Basic 6
standardmäßig enthalten) ist ein solcher Backup-Mechanismus recht
einfach anzulegen. Es erspart Ihnen die doch etwas umständliche
Hantiererei mit der "alten" Dir-Funktion
zur Ermittlung der bereits vorhandenen Versionen.
Die Funktion NumberedBackup erledigt die ganze Arbeit für Sie.
Lediglich die Microsoft Scripting Runtime müssen Sie noch als
Verweis in Ihr Projekt einbinden.
Sie übergeben der Funktion mindestens den Pfad der zu sichernden
Datei im ersten Parameter. Die übrigen Parameter sind optional.
Soll die Sicherung in einem anderen Verzeichnis erfolgen, geben Sie
in BackupPath dessen Pfad an. Die maximale Anzahl der Versionen
können Sie in BackupMaxNum angeben - voreingestellt sind 10
Versionen. In CreateBackupPath können Sie noch angeben, ob
das Sicherungsverzeichnis angelegt werden soll, falls es noch nicht
existiert - anderenfalls würde dann ein Laufzeitfehler ausgelöst (nbErrBackupPathNotFound).
Existiert die angegebene, zu sichernde Datei nicht, wird ebenfalls
ein Laufzeitfehler ausgelöst (nbErrSourceFileNotFound). Diese
beiden Laufzeitfehler wie auch unter Umständen andere Fehler (wenn
etwa das Ziellaufwerk nicht bereit ist o.ä.) können
Sie mit dem Einschalten einer Fehlerbehandlung vor dem Aufruf von
NumberedBackup abfangen.
Public Const nbErrBackupPathNotFound = vbObjectError + 10001
Public Const nbErrSourceFileNotFound = vbObjectError + 10002
Public Function NumberedBackup(SourceFile As String, _
Optional BackupPath As String, _
Optional ByVal BackupMaxNum As Integer = 10, _
Optional ByVal CreateBackupPath As Boolean) As String
Dim nBackupPath As String
Dim i As Integer
Dim nFileBaseName As String
Dim nBackupFileName As String
Dim nOldestFile As File
Dim nBackupFile As File
Dim nFileAttributes As Long
Dim nFNr As Long
Dim nContents() As Byte
On Error GoTo NumberedBackup_Error
With New FileSystemObject
If .FileExists(SourceFile) Then
If Len(BackupPath) Then
nBackupPath = BackupPath
If Not .FolderExists(nBackupPath) Then
If Not CreateBackupPath Then
Err.Raise nbErrBackupPathNotFound, , nBackupPath
Else
.CreateFolder nBackupPath
End If
End If
Else
nBackupPath = .GetParentFolderName(SourceFile)
End If
Else
Err.Raise nbErrSourceFileNotFound, , SourceFile
End If
nFileBaseName = .GetBaseName(SourceFile)
For i = 1 To BackupMaxNum
nBackupFileName = .BuildPath(nBackupPath, _
nFileBaseName & "." & Format$(i, "000"))
If .FileExists(nBackupFileName) Then
Set nBackupFile = .GetFile(nBackupFileName)
If nOldestFile Is Nothing Then
Set nOldestFile = nBackupFile
ElseIf nBackupFile.DateCreated < nOldestFile.DateCreated Then
Set nOldestFile = nBackupFile
End If
Else
Set nOldestFile = Nothing
Exit For
End If
Next 'i
If Not (nOldestFile Is Nothing) Then
nBackupFileName = nOldestFile.Path
End If
nFileAttributes = GetAttr(SourceFile)
nFNr = FreeFile
Open SourceFile For Binary Access Read Lock Read As #nFNr
ReDim nContents(1 To LOF(nFNr))
Get #nFNr, , nContents()
Close #nFNr
If .FileExists(nBackupFileName) Then
.DeleteFile nBackupFileName, True
End If
nFNr = FreeFile
Open nBackupFileName For Binary Access Write Lock Write As #nFNr
Put #nFNr, , nContents()
Close #nFNr
SetAttr nBackupFileName, nFileAttributes
NumberedBackup = nBackupFileName
End With
Exit Function
NumberedBackup_Error:
Err.Raise Err.Number, "NumberedBackup", Err.Description
End Function
Falls Sie sich darüber wundern sollten, dass nicht die
VB-Anweisung FileCopy
oder die Kopier-Methoden des FileSystemObjects verwendet werden:
Diese würden verhindern, dass jeweils die älteste Version gefunden
und überschrieben werden kann, weil sie beim Kopieren sowohl das
Erstellungs-Datum der Datei als auch das Datum der letzten Änderung
übernehmen. Die gesicherten Versionen wären hinsichtlich der
Datumsangaben identisch.
|