Registriert seit: 29. Mai 2002
37.621 Beiträge
Delphi 2006 Professional
|
Re: Pegasus: Einfaches backup Programm
2. Jun 2005, 01:17

Zitat von supermuckl:
wäre ich gestern nich so müde gewesen hätt ich dir noch geholfen.. naja 
jedenfalls cool das du es geschafft hast.
ich kann das teil sehr gut gebrauchen
Die beiden entscheidenden Routinen kan nich ja mal hier psoten:
Delphi-Quellcode:
procedure FindFilesToCopy(RootFolder: string; Mask: string = '*.*'; Recurse:
Boolean = True);
var
SR: TSearchRec;
s1, s: string;
begin
Application.ProcessMessages;
if bCanceled then Exit;
// Implementation bis einschließlich Delphi 4
if RootFolder = '' then
Exit;
if AnsiLastChar(RootFolder)^ <> '\' then
RootFolder := RootFolder + '\';
// Implementation ab Delphi 5
RootFolder := IncludeTrailingPathDelimiter(RootFolder);
// * * * * *
// nur bis einschließlich Delphi 4 benötigt
if Mask = '' then
Mask := '*.*';
// * * * * *
if Recurse then
if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then
try
repeat
if SR.Attr and faDirectory = faDirectory then
// --> ein Verzeichnis wurde gefunden
// der Verzeichnisname steht in SR.Name
// der vollständige Verzeichnisname (inkl. darüberliegender Pfade) ist
// RootFolder + SR.Name
if (SR.Name <> '.') and (SR.Name <> '..') then
FindFilesToCopy(RootFolder + SR.Name, Mask, Recurse);
until FindNext(SR) <> 0;
finally
FindClose(SR);
end;
if FindFirst(RootFolder + Mask, faAnyFile, SR) = 0 then
try
repeat
if SR.Attr and faDirectory <> faDirectory then
begin
s1 := copy(RootFolder, length(SourcePath) + 2, length(RootFolder));
s := BackupPath + '\' + s1 + SR.Name;
if (MD5_Hash2String(HashForFile(AnsiLowerCase(RootFolder +
SR.Name))) <>
MD5_Hash2String(HashForFile(AnsiLowerCase(s)))) or
(not FileExists(s)) then
begin
slFilesToCopy.Add(RootFolder + string(SR.Name));
end;
end;
until FindNext(SR) <> 0;
finally
FindClose(SR);
end;
end;
und
Delphi-Quellcode:
procedure FindFilesToDelete(RootFolder: string; Mask: string = '*.*';
Recurse: Boolean = True);
var
SR: TSearchRec;
s: string;
s1: string;
s2: string;
Index: Integer;
begin
Application.ProcessMessages;
if bCanceled then Exit;
// Implementation bis einschließlich Delphi 4
if RootFolder = '' then
Exit;
if AnsiLastChar(RootFolder)^ <> '\' then
RootFolder := RootFolder + '\';
// Implementation ab Delphi 5
RootFolder := IncludeTrailingPathDelimiter(RootFolder);
// * * * * *
// nur bis einschließlich Delphi 4 benötigt
if Mask = '' then
Mask := '*.*';
// * * * * *
if Recurse then
if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then
try
repeat
if SR.Attr and faDirectory = faDirectory then
// --> ein Verzeichnis wurde gefunden
// der Verzeichnisname steht in SR.Name
// der vollständige Verzeichnisname (inkl. darüberliegender Pfade) ist
// RootFolder + SR.Name
if (SR.Name <> '.') and (SR.Name <> '..') then
FindFilesToDelete(RootFolder + SR.Name, Mask, Recurse);
until FindNext(SR) <> 0;
finally
FindClose(SR);
end;
if FindFirst(RootFolder + Mask, faAnyFile, SR) = 0 then
try
repeat
if SR.Attr and faDirectory <> faDirectory then
begin
s1 := copy(RootFolder, length(SourcePath) + 2, length(RootFolder));
s := BackupPath + '\' + s1 + SR.Name;
s1 := copy(Sourcepath, 4, length(Sourcepath));
Index := pos(AnsiLowerCase(s1), AnsiLowerCase(BackupPath));
s2 := copy(RootFolder, Index, length(RootFolder));
s := copy(Sourcepath, 0, 3) + s2 + string(SR.Name);
if not FileExists(s) then
begin
slFilesToDelete.Add(RootFolder + SR.Name);
end;
end;
until FindNext(SR) <> 0;
finally
FindClose(SR);
end;
end;
Mein Fehler war wohl, dass ich mit dem Dateidatum gearbeitet habe und da etwas schief gegangen ist. Ich gehe jetzt über den Hash.
Zitat:
und werde das ganze dann auch noch nach kylix übersetzen und das dann auch hier posten (mit bin)
das dann als commandozeilen prog ohne librarys auskommt
natürlich nur mit deiner erlaubnis.. darf ich? 
Ja klar, kein Problem.
Zitat:
achja
Aber man könnte es bestimmt so erweitern, dass man auch eine komplette Synchronisation implementiert. Kommt eventuell im nächsten Schritt oder so.
diese komplettsync würde ich jetzt eher nicht gebrauchen wollen weil ich die quelldaten auf alle fälle unberührt haben soll
deshalb wenn, dann abschaltbar oder in extra version bitte 
Logisch, wenn dann nur optional. Aber ich habe mir das mal durch den Kopf gehen lassen, da müsste man die Suche irgendwie optimieren.
Michael Ein Teil meines Codes würde euch verunsichern.
|
|
Zitat
|