Automatische Sicherungskopie älteste löschen

Moderator: ModerationP

Automatische Sicherungskopie älteste löschen

Beitragvon MononokeHime » 05. Okt 2020, 10:20

Hallo,

ich verwende einen VBA-Code im Startformular, welches mir automatisch beim erstmaligen Öffnen der Datenbank an dem jeweiligen Tag eine Sicherungskopie in einem Ordner erstellt.
Das funktioniert so weit auch sehr gut.
Nun würde ich aber gerne nur maximal 10 Sicherungskopien im Ordner haben, also die älteste jeweils löschen, wenn 10 Kopien im Ordner sind.

Weiß jemand, wie ich den VBA-Code dafür anpassen müsste?

Folgenden Code habe ich in einem Modul gespeichert, welches über das Startformular aufgerufen wird:

Code: Alles auswählen
Public Function DB_Sicher()

    On Error Resume Next

    Dim Quelldatei As String
    Dim Zieldatei As String
    Dim oFSO As Variant
    Dim y As String
    Dim z As String
   
    Dim lngCnt As Long      'Z?hler wieviele Dateien im BackupVerzeichnis sind

    Quelldatei = CurrentProject.FullName
    y = CurrentProject.Path
    z = CurrentProject.Name
    Zieldatei = y & "\Sicherungskopien\" & Left(z, Len(z) - 4) & "_" & _
                Year(Now) & "_" & Month(Now) & "_" & Day(Now) & ".accdb"
   
        Do While lngCnt > 9       '9 = Anzahl der Backupdateien exkl. neues Backup
        If Quelldatei < Zieldatei Then      ' Dateiname < Ziel ==> aelteres Backup!
            Quelldatei = y & Quelldatei
            intAttr = GetAttr(Quelldatei)
            If intAttr And vbReadOnly Then
                'SetAttr strFile, intAttr - vbReadOnly
                SetAttr strFile, 0
            End If
            oFSO.DeleteFile Quelldatei
        End If
        lngCnt = oFSO.GetFolder(y).Files.Count
        Quelldatei = Dir                                           'N?chste Datei
    Loop

   
   
    If Dir(Zieldatei) = "" Then
        Set oFSO = CreateObject("Scripting.FileSystemObject")
        oFSO.CopyFile Quelldatei, Zieldatei, True
        'SetAttr Zieldatei, vbReadOnly
        'MsgBox "Es wurde eine Sicherheitskopie unter " & _
               Zieldatei & " erstellt"
    End If
   
 
   
End Function


Vielen Dank im voraus!!
MononokeHime
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 68
Registriert: 23. Mär 2018, 13:17

Re: Automatische Sicherungskopie älteste löschen

Beitragvon KlausMz » 05. Okt 2020, 10:30

Hallo,
speichere die Kopiervorgänge mit Datum und Dateiname in einer extra Tabelle, mit einem Datum. Dann zählst Du mit DCount die Datensätze in dieser Tabelle, sind 11 erreicht wird die ältest Datei gelöscht. Über Datum und Dateiname in dieser Tabbelle ist das ganz einfach.

PS:
Ich würde Dir dringend raten, das Vorhaben zu überdenken. Man kopiert keine geöffnete Datei. Im Explorer wird das vom Betriebssystem nicht umsonst verhindert.
Es besteht die Gefahr, dass Du Dir Original und Backup zerschießt.

Die Sicherung sollte über eine extra DB aufgerufen werden, oder generell außerhalb von Access.
Gruß
Klaus . . . . . Feedback wäre wünschenswert.
Ich möchte bitte keine unaufgeforderten PN. Fragen bitte im Forum.
Benutzeravatar
KlausMz
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 39832
Registriert: 06. Okt 2003, 15:09
Wohnort: Irgendwo in der Pfalz

Re: Automatische Sicherungskopie älteste löschen

Beitragvon knobbi38 » 05. Okt 2020, 10:52

Hallo,

wie Klaus schon angemerkt hat, ist das Kopieren der aktuellen DB sicher nicht die beste Wahl und das Prozedere sollte anders gemacht werden, z.B. einfach mit einem Start über eine Batch-Datei.

Unabhängig davon ist deine kleine Funktion (welche keinen Rückgabewert liefert!) stark verbesserungswürdig. Ein Mix aus klassischen VBA Anweisung und FSO zur Dateiverarbeitung, Variablen die abgefragt werden, bevor sie richtig initialisiert bzw. deklariert werden, z.B. lngCount, Quelldatei usw. und dann wird ein Vergleich auf kleiner mit zwei Strings vorgenommen, was in aller Regel sehr problematisch ist, es sei denn, so etwas wird bewußt so eingesetzt. Was ist mit der Verwendung von "Option Explicit" ?
Hast du nur mal ansatzweise versucht durchzugehen, was dein Code machen soll und tatsächlich macht, z.B. im Debugger?

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 2798
Registriert: 02. Jul 2015, 14:23

Re: Automatische Sicherungskopie älteste löschen

Beitragvon Granados » 17. Okt 2020, 21:22

Hallo, ich hab ein ähnliches Problem mit Hilfe von "forefiles" gelöst. Diese Betriebssystem-Anweisung ermöglicht das Löschen von Dateien nach Alter.
Es wird eine entsprechende Anweisung in einem Batch über die Windows Aufgabenplanung ausgeführt.
Die Sicherung läuft dabei außerhalb vom Access, ein Weg, der sich nach langer Bastelei als erfogreich erwiesen hat.
Bei Bedarf liefer ich einen Beispielcode.

Gruß: Granados
Granados
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 258
Registriert: 03. Dez 2014, 16:19
Wohnort: Hessen

Re: Automatische Sicherungskopie älteste löschen

Beitragvon MononokeHime » 16. Nov 2020, 12:28

Hallo Granados,

das hört sich gut an!
Wenn Du Deinen Beispielcode teilen kannst, wäre super!

Schon mal vielen Dank im voraus!
MononokeHime
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 68
Registriert: 23. Mär 2018, 13:17

Re: Automatische Sicherungskopie älteste löschen

Beitragvon Granados » 25. Nov 2020, 14:58

Hallo, folgenden Batch kannst Du zeitgesteuert über die Windows-Aufgabenplanung ablaufen lassen.
Der Batch hat folgenden Inhalt:

del "c:\temp\sicherung.mdb"
copy "MeineDB.mdb" "c:\temp\sicherung.mdb"

(Hier wird zunächst das Verszeichnis temp für die Zwischensicherung vorbereitet. Ich hab das zur Sicherheit gemacht, um nicht meine Realdaten, MeineDB.mdb, aus Versehen zu löschen. Kopiere also Deine Datenbank, die Du sichern willst, hier MeineDB, in ein separates Verzeichnis, hier c:\temp und benenne sie dort sicherung.mdb)

if not exist c:\temp\sicherung.mdb goto raus

(Sollte das aus irgendeinem Grund nicht geklappt haben, mach Schluss.)

copy "c:\temp\sicherung.mdb" "f:\sicherung.mdb%DATE:~8,2%%DATE:~3,2%%DATE:~0,2%-%TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2%"

(Hier wird die Sicherung auf einen Stick (f:) kopiert und noch zusätzlich mit Datums- und Zeitangaben versehen, somit hat man Sicherungen zu verschiedenen Zeitpunkten.)

Forfiles /P f:\ /S /D -8 /C "cmd /c del /q @path"

(Diese Anweisung löscht alle Sicherungen älter als 8 Tage auf dem Stick)

:raus

Du kannst das Ganze sicherlich auch noch vereinfachen.
Viel Erfolg: Granados
Granados
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 258
Registriert: 03. Dez 2014, 16:19
Wohnort: Hessen


Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste