Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Verzeichnisse synchronisieren (A > B) - welcher Ansatz? (https://www.delphipraxis.net/166851-verzeichnisse-synchronisieren-b-welcher-ansatz.html)

MiKaEr 2. Mär 2012 13:55

Verzeichnisse synchronisieren (A > B) - welcher Ansatz?
 
ich frage mich gerade, welches eine gute lösung ist, zwei verzeichnisse miteinander zu synchronisieren.
dabei wird verzeichnis A mit B verglichen. dateien/ordner, welche sich in A befinden, in B jedoch nicht, werden von A nach B kopiert.

modifizierte dateien/ordner in verzeichnis A werden auch nach B kopiert.


ist es nun ein guter ansatz, das letzte änderungsdatum eines jeden ordners/einer jeden datei auszulesen und somit zu vergleichen?
oder sollte man einen hash des ordners/der datei bilden?

p80286 2. Mär 2012 14:33

AW: Verzeichnisse synchronisieren (A > B) - welcher Ansatz?
 
Das Datum würde ich nicht verwenden, da es schon vorgekommen sein soll, daß zur Umstellung von Sommer auf Winterzeit die Dateidaten auf Server/Client um eine Stunde differierten.

Ein brauchbares Unterscheidungskritierium ist meiner Meinung nach die Dateigröße, Dateien mit gleichem Namen und unterschiedlicher Größe sind nicht gleich. Alles was gleich ist könnte man binär oder über einen Hash-Wert prüfen.
Wird der Hash nicht noch für andere Zwecke benötigt, sollte ein Binärvergleich schneller sein, da dieser nur bis zur ersten Ungleichheit laufen muß.

Gruß
K-H

MiKaEr 2. Mär 2012 14:54

AW: Verzeichnisse synchronisieren (A > B) - welcher Ansatz?
 
wie funktioniert so ein binärvergleich denn?

Bummi 2. Mär 2012 14:59

AW: Verzeichnisse synchronisieren (A > B) - welcher Ansatz?
 
http://www.delphi-forum.de/viewtopic...n%E4rvergleich

MiKaEr 2. Mär 2012 15:02

AW: Verzeichnisse synchronisieren (A > B) - welcher Ansatz?
 
danke für den link (google zeigte mir den nicht oO)

folgendes gucke ich mir auch mal an:
http://www.delphipraxis.net/345506-post81.html

MiKaEr 2. Mär 2012 16:50

AW: Verzeichnisse synchronisieren (A > B) - welcher Ansatz?
 
ok, die lösung von negaH funktioniert soweit sehr gut und verstehen tue ich sie auch.

ein ganz anderes problem ist gerade.. wie synchronisiere ich zwei verzeichnisse SINNVOLL?

ich hatte es schon damit versucht, beide verzeichnis strukturen in stringlisten zu schreiben und diese mit einer verschachtelten schleife durchzuiterrieren.
das funktioniert aber nur.. sagen wir mal, in einem von hundert fällen.

gibt es bessere möglichkeiten?

p80286 2. Mär 2012 16:59

AW: Verzeichnisse synchronisieren (A > B) - welcher Ansatz?
 
Wie meinst du das?
Im allgemeinen sollte das doch so aussehen
Basisverzeichnis+einzelfallverzeichis+DateinameX
wobei gelten könnte
für akt Sourcen:
Basisverzeichnis = "C:\Delphi\D2006\DBprogramme"
EinzelfallVerzeichnis= "Anlagenverwaltung\V1\
DateinameX= "AnlageMain.dpr"

und für das Backup:

Basisverzeichnis = "D:\Backups\2011\Delphi\D2006\DBprogramme"
EinzelfallVerzeichnis= "Anlagenverwaltung\V1\
DateinameX= "AnlageMain.dpr"

wobei Dateinamex natürlich nacheinander alle Dateien in einem Verzeichnis enthalten kann (die verglichen werden sollen)



Gruß
K-H

MiKaEr 2. Mär 2012 17:02

AW: Verzeichnisse synchronisieren (A > B) - welcher Ansatz?
 
ok, noch einmal detallierter (war meni fehler):

ich habe verzeichnis A und verzeichnis B.
angenommen diese haben nun exakt den selben inhalt.

später lösche ich z.b. "dateixyz.txt" aus verzeichnis A. bei einem automatischen backup sollte dann nun auch, falls vorhanden, die datei "dateixyz.txt" aus verzeichnis B gelöscht werden.

das ganze nenne ich nun einfach mal eine "exakte kopie". es wird nicht einfach "drauflos kopiert", sondern vorher "müll" von verzeichnis B entfernt.

wie ich das ressourcenschonen mache, weiß ich nicht.

ich könnte ganz einfach den inhalt von verzeichnis B löschen und den inhalt von A nach B kopieren. das dauert aber immer sehr lange (große verzeichnisse) und ist nicht im sinne des erfinders.

Bummi 2. Mär 2012 17:11

AW: Verzeichnisse synchronisieren (A > B) - welcher Ansatz?
 
Wenn Du in Deinen Listen die Relativpfad mit Dateinamen
(ich verwende hier gerne Clientdatasets mit allen zusätzlichen Informationen Größe/Änderung etc.)
aus beiden Verzeichnissen sammelst kannst Du doch direkt:
aussieben was nicht beachtet werden sollen,
die löschen die nach Vergleich nicht kopiert werden müssen,
solche kopieren die fehlen
und jene löschen die überzählig sind.

gegf. wäre so etwas wie ein SVN für Dich auch interessant ...

MiKaEr 2. Mär 2012 17:13

AW: Verzeichnisse synchronisieren (A > B) - welcher Ansatz?
 
das war auch bereits mein ansatz, an welchem ich aber kläglich gescheitert bin (zwei verschaltelte for-schleifen und zwei stringlisten)

Bummi 2. Mär 2012 17:15

AW: Verzeichnisse synchronisieren (A > B) - welcher Ansatz?
 
Eine Schleife und in der 2. Liste mit IndexOf arbeiten ?
oder 2 Clientdatasets Master/Detail verknüpft und while not EOF über den Master laufen.

MiKaEr 2. Mär 2012 17:17

AW: Verzeichnisse synchronisieren (A > B) - welcher Ansatz?
 
mhh..

was aber, wenn die erste schleife 2 einträge hat und die zweite schleife 10. dann gibt es glaube ich schon wieder ein problem.

ich habe absolut keine ahnung und keinen gescheiten lösungsansatz mehr.


Delphi-Quellcode:
for i := 0 to sourceDir.Count - 1 do
 begin
  for j := 0 to destDir.Count - 1 do
   begin
    // ???
   end;
 end;

Aviator 2. Mär 2012 17:21

AW: Verzeichnisse synchronisieren (A > B) - welcher Ansatz?
 
Hi MiKaEr

ich denke mal du willst eine differentielle/inkrementelle Sicherung machen, oder?
Wenn ja kannst du vielleicht mal nach diesen Stichworten bei Google suchen. Nach der Dateigröße würde ich jedoch nicht gehen, da du ja nicht weißt, ob die Datei mit der kleineren Dateigröße neuer ist oder die mit der Größeren.

m.f.G. Aviator.

MiKaEr 2. Mär 2012 17:24

AW: Verzeichnisse synchronisieren (A > B) - welcher Ansatz?
 
ich habe zwar eine ausbildung im informatikbereich als javaprogrammierer gemacht, aber differentielle/inkrementelle sagt mir nichts mehr (zu lange her ;) )

ich habe hier gerade einen netten ansatz gefunden, welchen ich für meine zwecke, so denke ich, anpassen werde:
http://www.delphipraxis.net/723725-post4.html

Bummi 2. Mär 2012 17:26

AW: Verzeichnisse synchronisieren (A > B) - welcher Ansatz?
 
zerlege es in Schritte
1.) Beide Listen füllen
2.) die eliminieren die nicht geändert wurden PSEUDOCODE
Delphi-Quellcode:
       For i := SourceListe.Count -1 DonwTo 0 do
       begin
       x := Backupliste.IndexOf(SourceListe[i]);
       if (x>-1) and // Dein Vergleich stellt fest identisch then
          begin
             SourceListe.Delete(i);
             Backupliste.Delete(x);
          end;
       end;
3.) Kopieren was noch in Sourceliste drin ist, dabei gleich löschen (auch in Backupliste) wenn vorhanden
4.) was noch in der Backupliste steht löschen

ich hoffe ich habe nichts übersehen ....

Aviator 2. Mär 2012 17:28

AW: Verzeichnisse synchronisieren (A > B) - welcher Ansatz?
 
Zitat:

Zitat von MiKaEr (Beitrag 1154170)
ich habe zwar eine ausbildung im informatikbereich als javaprogrammierer gemacht, aber differentielle/inkrementelle sagt mir nichts mehr (zu lange her ;) )


Hier mal eine kleine Auflistung der Sicherungsarten: Sicherungsarten

Bummi 2. Mär 2012 17:33

AW: Verzeichnisse synchronisieren (A > B) - welcher Ansatz?
 
@Aviator

ich habe den Eindruck er möchte einfach 2 Ordner auf identischen Stand halten ...

Aviator 2. Mär 2012 17:35

AW: Verzeichnisse synchronisieren (A > B) - welcher Ansatz?
 
Ja das kann er ja machen. Nur ich habe ihm als Hinweiß einfach nur das Stichwort "differentiell/inkrementell" gegeben. Da diese Sicherungsart genau auf dem Prinzip basiert wie er es auch vorhat zu programmieren.

m.f.G. Aviator

p80286 2. Mär 2012 17:45

AW: Verzeichnisse synchronisieren (A > B) - welcher Ansatz?
 
@Bummi
Dein Ansatz gefällt mir, nicht so umständlich wie ich's realisiert habe.

Gruß
K-H

Bummi 2. Mär 2012 17:47

AW: Verzeichnisse synchronisieren (A > B) - welcher Ansatz?
 
Danke :oops::oops:

MiKaEr 2. Mär 2012 18:51

AW: Verzeichnisse synchronisieren (A > B) - welcher Ansatz?
 
danke für deine erklärung, bummi =)

habe es nun folgendermaßen umgeschrieben:

Delphi-Quellcode:
for i := slDest.Count - 1 downto 0 do // gehe komplette ZIEL-liste durch (alle pfade zu dateien/ordner des zielverzeichnis)
 begin
  if sl.IndexOf(slDest[i]) = -1 then // wenn datei/ordner "i" des zielverzeichnis nicht im quellverzeichnis auffindbar ist dann ..
   begin
    slDest.Delete(i); // .. lösche diesen veralteten eintrag aus der ZIEL-liste (kommt einem löschen einer datei/eines ordner gleich)
   end;
 end;
so müsste es eigentlich richtig sein, glaube ich :?

Aviator 2. Mär 2012 20:39

AW: Verzeichnisse synchronisieren (A > B) - welcher Ansatz?
 
Eine Frage hätte ich dazu noch. Woran machst du aus, welcher Ordner neuer ist? Er könnte ja später erst erstellt worden sein? Du müsstest ja dann noch irgendwo einen Vergleich haben.

m.f.G. Aviator

MiKaEr 2. Mär 2012 21:10

AW: Verzeichnisse synchronisieren (A > B) - welcher Ansatz?
 
ich durchsuche ein quellverzeichnis rekursiv und schreibe alle dateinamen mit relativen pfaden in eine strnigliste.

diese liste durchlaufen ich und ich vergleiche jede quelldatei mit jeder zeldatei (falls vorhanden) mit folgendem code von negaH:
http://www.delphipraxis.net/345506-post81.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:01 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