Inkrementelles Backup mit PureZip ?!

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Inkrementelles Backup mit PureZip ?!

Beitrag von Ghosty1967 »

Hallo Leute...

Ich bastel gerade an einem automatischen Backup, welches Dateien von vier Rechnern sammeln soll und diese
auf einem Server in ein angegebenes Verzeichnis packen soll. Dabei ist es wichtig, das bereits vorhandene
Dateien innerhalb des Archives nicht überschrieben werden. Mit der PureZip-Library komme ich soweit
eigentlich ganz gut klar, nur kann man hiermit anscheinend keine inkrementellen Backups machen.
Auch in der Hilfedatei von PureZip finde ich leider nichts, was mir weiterhelfen würde.

Hat jemand einen Tipp für mich, ich würde auch eine andere Lib nehmen... wäre für jede Hilfe dankbar!
Benutzeravatar
gnozal
Beiträge: 219
Registriert: 04.12.2004 13:01
Wohnort: Frankreich (67)
Kontaktdaten:

Re: Inkrementelles Backup mit PureZip ?!

Beitrag von gnozal »

Ghosty1967 hat geschrieben:Hallo Leute...

Ich bastel gerade an einem automatischen Backup, welches Dateien von vier Rechnern sammeln soll und diese
auf einem Server in ein angegebenes Verzeichnis packen soll. Dabei ist es wichtig, das bereits vorhandene
Dateien innerhalb des Archives nicht überschrieben werden. Mit der PureZip-Library komme ich soweit
eigentlich ganz gut klar, nur kann man hiermit anscheinend keine inkrementellen Backups machen.
Auch in der Hilfedatei von PureZip finde ich leider nichts, was mir weiterhelfen würde.

Hat jemand einen Tipp für mich, ich würde auch eine andere Lib nehmen... wäre für jede Hilfe dankbar!
PureZIP doesn't have any specific function for backups.
But, if you add the same file to an archive twice or more, the previous copy will not be erased : there will be several copies with the same filename in the archive [file date and file crc may be different].
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Beitrag von Ghosty1967 »

PureZIP doesn't have any specific function for backups.
But, if you add the same file to an archive twice or more, the previous copy will not be erased : there will be several copies with the same filename in the archive [file date and file crc may be different].
Yeh, thats what i see if i add same files to a archive... Can you tell me, how to check, if the file already exists in an archive.
I think, thats the way to realize an incremental backup?!
I used the code-example in the help file and i dont know, how to edit it to check for existing files!
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Ghosty1967 hat geschrieben:Can you tell me, how to check, if the file already exists in an archive.
Du kannst anhand der Original-Dateigröße und der CRC32 überprüfen, ob die
evtl. vorhandene Datei geändert worden ist.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Beitrag von Ghosty1967 »

Du kannst anhand der Original-Dateigröße und der CRC32 überprüfen, ob die
evtl. vorhandene Datei geändert worden ist.
Ja, aber ich muß ja innerhalb des Archives prüfen, ob die Datei schon existiert...
Im Moment arbeite ich einfach mit

Code: Alles auswählen

zipFiles.s="C:\pstand\calstand\calwert\*.cal"
zipArchive.s="O:\Sales and Aftersales\LABORRECHNER\Daten\Kalibrierscheine.zip"
PureZIP_AddFiles(zipArchiv, zipFiles, #PureZIP_StorePathRelative, #PureZIP_Recursive)
das funktioniert auch, aber wie muß der Code aussehen, wenn ich mit den Befehlen
- PureZIP_Archive_Create
- PureZIP_AddFile
usw. arbeiten möchte um einzelne Dateien an ein bestehendes Archiv zu hängen und
vorher zu überprüfen, ob die Datei bereits vorhanden ist ???
bzw. Wie kann ich den Inhalt von "zipFiles.s" feststellen und auslesen ???
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

PureZIP_AddFiles() ist sicherlich die für den Programmierer bequemste Art
und Weise, Dateien einem ZIP-File hinzuzufügen. Für Dein Vorhaben solltest
Du allerdings PureZIP_Archive_Create() in Verbindung mit
PureZIP_Archive_Compress() verwenden. Hierbei hast Du eine bessere
Kontrolle darüber, welche Dateien Du einem Archiv hinzufügst und welche
nicht.

Parallel dazu musst Du dann auch PureZIP_GetFileInfo() verwenden, um
Informationen über die bereits im ZIP vorhandenen Dateien zu erhalten.
Hierbei sind für Dich relevant:

1.) Ist die Datei schon im ZIP vorhanden? Wenn nicht -> Datei hinzufügen
2.) Ist die Dateilänge gleich? -> Wenn nicht -> Datei hinzufügen
3.) Ist die CRC32 gleich? -> Wenn nicht -> Datei hinzufügen

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Beitrag von Ghosty1967 »

Für Dein Vorhaben solltest
Du allerdings PureZIP_Archive_Create() in Verbindung mit
PureZIP_Archive_Compress() verwenden. Hierbei hast Du eine bessere
Kontrolle darüber, welche Dateien Du einem Archiv hinzufügst und welche
nicht.
Parallel dazu musst Du dann auch PureZIP_GetFileInfo() verwenden, um
Informationen über die bereits im ZIP vorhandenen Dateien zu erhalten.
Hierbei sind für Dich relevant:
1.) Ist die Datei schon im ZIP vorhanden? Wenn nicht -> Datei hinzufügen
2.) Ist die Dateilänge gleich? -> Wenn nicht -> Datei hinzufügen
3.) Ist die CRC32 gleich? -> Wenn nicht -> Datei hinzufügen
Könntest Du mir da ein Programmbeispiel posten, ich habe schon diverse Sachen versucht, komme aber nicht weiter.
In meinem Programm, durchsuche ich als erstes das zu packende Stammverz. rekursiv und
speichere die gefundenen Dateien in einer Liste. Diese Dateien könnte ich ja dann einzeln zum Archiv
hinzufügen und vorher im Archiv nachschauen, ob sie schon vorhanden sind.
Aber ich weiss absolut nicht wie.
Ich stehe hier wie der "Ochs vorm Berg!" :lol:
Wenn Du mir helfen könntest, wäre ich sehr dankbar!
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Ghosty1967 hat geschrieben:Könntest Du mir da ein Programmbeispiel posten, ich habe schon diverse
Sachen versucht, komme aber nicht weiter.
sorry, kann ich momentan nicht so mal eben aus dem Ärmel schütteln ;-)

Du hast also die zu zippenden Dateien in einer Liste gespeichert. Diese
Liste durchläufst Du nun Datei für Datei (ForEach ... Next oder For ... Next).

Anhand des Dateinamens kannst Du nun den Zeiger innerhalb des bereits
vorhandenen ZIPs auf den aktuellen Eintrag setzen:

Code: Alles auswählen

PureZIP_Archive_Locate(FileName.s)
danach kannst Du mit PureZIP_Archive_FileInfo() die benötigten
Informationen auslesen, welche in der Structure PureZIP_FileInfo
vorliegen.

Das ist in der Online-Hilfe eigentlich ziemlich gut dokumentiert.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
gnozal
Beiträge: 219
Registriert: 04.12.2004 13:01
Wohnort: Frankreich (67)
Kontaktdaten:

Beitrag von gnozal »

Ghosty1967 hat geschrieben:Yeh, thats what i see if i add same files to a archive... Can you tell me, how to check, if the file already exists in an archive.
I think, thats the way to realize an incremental backup?!
I used the code-example in the help file and i dont know, how to edit it to check for existing files!
Simply parse the archive using PureZIP_FindFirst()/PureZIP_FindNext(), getting the file information with PureZIP_Archive_FileInfo().

Code: Alles auswählen

myFileinfo.PureZIP_FileInfo
If PureZIP_Archive_Read(MyZIP.s)
  ReturnValue.l = PureZIP_Archive_FindFirst() = #UNZ_OK
  While ReturnValue = #UNZ_OK 
    Debug PureZIP_Archive_FileInfo(@myFileinfo)
    Debug "Filename: " + myFileinfo\FileName
    Debug "Compressed Size: " + Str(myFileinfo\CompressedSize)
    Debug "Uncompressed Size: "+ Str(myFileinfo\unCompressedSize)
    ; etc ...
    ReturnValue = PureZIP_Archive_FindNext()
  Wend
  PureZIP_Archive_Close()
EndIf
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von Thorsten1867 »

Code: Alles auswählen

Structure ZipInfoStructure
  Name.s
  date.l
  Size.l
EndStructure
Global NewList ZipFiles.ZipInfoStructure()

Procedure ExamineZip(ZipFile.s)
  myFileinfo.PureZIP_FileInfo
  If PureZIP_Archive_Read(ZipFile)
    ReturnValue.l = PureZIP_Archive_FindFirst()
    While ReturnValue = #UNZ_OK 
      PureZIP_Archive_FileInfo(@myFileinfo)
      AddElement(ZipFiles())
      ZipFiles()\Name = myFileinfo\FileName
      ZipFiles()\date = Date(myFileinfo\tmu_date\tm_year, myFileinfo\tmu_date\tm_mon + 1, myFileinfo\tmu_date\tm_mday, myFileinfo\tmu_date\tm_hour, myFileinfo\tmu_date\tm_min, myFileinfo\tmu_date\tm_sec)
      ZipFiles()\Size = myFileinfo\unCompressedSize
      ReturnValue = PureZIP_Archive_FindNext()
    Wend
    PureZIP_Archive_Close()
  EndIf 
EndProcedure
Wenn man auch noch das Quellverzeichnis in eine LinkedList einliest, kann man beide abgleichen. Einfach bei allen Dateien, die sich nicht verändert haben (Datum/Größe) 'SrcFiles()\update = #False' setzen. Danach kann man kann alle Dateien (ForEach ... Next) mit 'SrcFiles()\update = #True' aktualisieren.

Code: Alles auswählen

Structure FilesStructure
  Name.s
  date.l
  Size.l
  update.b
EndStructure
Global NewList SrcFiles.FilesStructure()

ProcedureDLL.s GetSubDirFilePart(thFile.s, thPath.s) ; Relative path of file
  If Right(thPath, 1) <> "\" : thPath + "\" : EndIf
  If FindString(thFile, thPath, 1) = 1
    ProcedureReturn RemoveString(thFile, thPath)
  Else
    ProcedureReturn thFile
  EndIf
EndProcedure

Procedure ExamineSrcDir(directory.s, ScrDir.s)
  UsedDirectory = ExamineDirectory(#PB_Any, directory,"*.*")
  If UsedDirectory
    While NextDirectoryEntry(UsedDirectory) 
      EntryType.l = DirectoryEntryType(UsedDirectory) 
      entryname.s = DirectoryEntryName(UsedDirectory) 
      If entryname = "." Or entryname = ".." : Continue : EndIf 
      Select EntryType
        Case 1 ; Datei
          AddElement(SrcFiles())
          file$ = directory + entryname
          SrcFiles()\Name = GetSubDirFilePart(file$, ScrDir)
          SrcFiles()\date = DirectoryEntryDate(UsedDirectory, #PB_Date_Modified) 
          SrcFiles()\Size = DirectoryEntrySize(UsedDirectory)
          SrcFiles()\update = #True
        Case 2
          ExamineSrcDir(directory+entryname+"\", ScrDir)
      EndSelect
    Wend
    FinishDirectory(UsedDirectory)
  EndIf
EndProcedure
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Antworten