![]() |
AW: Windows 7 änderungsdatum
Zitat:
Bernhard |
AW: Windows 7 änderungsdatum
Das sage ich ja auch die ganze Zeit. Wer den verlinkten Wikipedia-Artikel gelesen hat, der weiß auch, dass das Archiv-Attribut ja extra für inkrementelle Sicherungen gedacht ist.
|
AW: Windows 7 änderungsdatum
Zitat:
|
AW: Windows 7 änderungsdatum
Und wenn es unbedingt mit Delphi sein muss, dazu habe ich mir mal ein paar Gedanken gemacht (VORSICHT: Code ist komplett ungetestet):
Delphi-Quellcode:
Ich hoffe, ich habe keinen groben Denkfehler gemacht, ansonsten bitte korrigieren.
uses StrUtils;
procedure IncrementalBackup(SrcDir, DestDir: string; ErrorLog: TStrings; CopyEmptyDirs: Boolean = false); procedure Log(const Msg: string); begin if Assigned(ErrorLog) then ErrorLog.Add(Msg); end; const faNewAnyFileEx = $00017FFF; // erweitertes faAnyFile aus der DP INVALID_DIRS = 'Zielverzeichnis darf nicht im Quellverzeichnis enthalten sein'; var SearchRec: TSearchRec; DestPath: string; AttrCode: integer; begin if AnsiContainsText(SrcDir, DestDir) then raise Exception.Create(INVALID_DIRS); SrcDir := IncludeTrailingPathDelimiter(SrcDir); DestDir := IncludeTrailingPathDelimiter(DestDir); if FindFirst(SrcDir + '*.*', faNewAnyFileEx, SearchRec) = 0 then try repeat if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then begin // Verzeichnis gefunden if (SearchRec.Attr and faDirectory) = faDirectory then begin DestPath := DestDir + SearchRec.Name; // ggf. anlegen if CopyEmptyDirs then begin if not(DirectoryExists(DestPath) or ForceDirectories(DestPath)) then Log(DestPath + ' konnte nicht angelegt werden.'); end; // Rekursiver Aufruf IncrementalBackup(SrcDir + SearchRec.Name, DestPath, ErrorLog, CopyEmptyDirs); end // Datei gefunden else begin DestPath := DestDir + ExtractFilename (ExcludeTrailingPathDelimiter(SrcDir)); // nur bei gesetztem Archiv-Attribut oder wenn nicht vorhanden if ((SearchRec.Attr and faArchive) = faArchive) or not FileExists(DestDir + SearchRec.Name) then begin // Zielverzeichnis ggf. anlegen if not(DirectoryExists(DestPath) or ForceDirectories(DestPath)) then Log(DestPath + ' konnte nicht angelegt werden.') else begin // Datei kopieren if not CopyFile(PChar(SrcDir + SearchRec.Name), PChar(DestPath + SearchRec.Name), false) then Log(Format('%s: %s', [DestPath + SearchRec.Name, SysErrorMessage(GetLastError)])) // bei Erfolg Archiv-Attribut entfernen else begin AttrCode := FileSetAttr(SrcDir + SearchRec.Name, SearchRec.Attr and not faArchive); if AttrCode <> 0 then Log(Format('%s: %s', [DestPath + SearchRec.Name, SysErrorMessage(AttrCode)])); end; end; end; end; end; until FindNext(SearchRec) <> 0; finally SysUtils.FindClose(SearchRec); end; end; [edit] Code nochmal durch den Formatter gejagt [/edit] |
AW: Windows 7 änderungsdatum
Nein, Denkfehler habe ich keine gefunden, auch beim 2. Mal Drüberschauen wurde mir die Verwendung von CopyEmptyFiles klar.
Bernhard |
AW: Windows 7 änderungsdatum
Nun müsste man nur noch jemanden finden, der den Mut hat, das mal zu testen :roll:
|
AW: Windows 7 änderungsdatum
Zitat:
|
AW: Windows 7 änderungsdatum
[OT] Ich merke schon, der Luckie will mich loswerden :lol: [/OT]
|
AW: Windows 7 änderungsdatum
kann dein Code leider noch nicht testen, da viele Befehle Delphi 5 wohl nicht kennt, aber mit 2010 sollte das wohl gehen.
|
AW: Windows 7 änderungsdatum
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz