AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Pegasus: Luckies persönliches Synchronisationstool
Thema durchsuchen
Ansicht
Themen-Optionen

Pegasus: Luckies persönliches Synchronisationstool

Ein Thema von Luckie · begonnen am 28. Feb 2005 · letzter Beitrag vom 8. Jan 2009
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Re: Pegasus: Einfaches backup Programm

  Alt 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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:19 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