Entwickler-Ecke
Sonstiges (Delphi) - Nur Aktualisierte Dateien kopieren?
DiamondDog - Mo 04.08.08 15:20
Titel: Nur Aktualisierte Dateien kopieren?
Hallo Leute wie ich von einem Ordner eine Copy machen kann weiß ich.
Nur ich weiß nicht wie ich in den Code ändenr muss, das er alle Dateien die sich im Ordner befindet überprüft ob sie verändert wurden und dann nur die veränderten Dateien kopiert.
Hier mal mein Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| function DoFileWork(aOperation: FILEOP_FLAGS; aFrom, aTo: AnsiString; Flags: FILEOP_FLAGS): Integer; var FromPath, ToPath: AnsiString; SHFileOpStruct: TSHFileOpStruct; begin FromPath := aFrom + #0#0; ToPath := aTo + #0#0; with SHFileOpStruct do begin Wnd := 0; wFunc := aOperation; pFrom := PAnsiChar(FromPath); if ToPath <> '' then begin pTo := PAnsiChar(ToPath) end else begin pTo := nil; end; fFlags := Flags; end; Result := SHFileOperationA(SHFileOpStruct); end;
procedure TfmHistoryBackupOptions.BackupClick(Sender: TObject); begin DoFileWork(FO_COPY, Edit1.Text, Edit2.Text, 0); end; |
Danke schon mal fürs Helfen.
Mfg Dog
nagel - Mo 04.08.08 15:47
Woran willst du erkennen, ob sie verändert wurden? Du kannst einfach das Datum der letzten Änderung einer Datei abfragen (-> Suche) und das mit dem Datum der letzten Kopieraktion vergleichen (das du dann vermutlich irgendwo speichern solltest).
DiamondDog - Mo 04.08.08 15:55
Ich brauch doch nur das änderungs Datum der Datein im Ordner abfragen und wenn sie gleich sind wie der Backup Ordner dann passiert nix und wenn sie neu sind dann soll er die neuen Kopieren.
wirbeldelphi - Mo 04.08.08 17:49
Ich würd von jeder Datei einen Hashwert speichern. MD5 wär z.B. perfekt.
nagel - Mo 04.08.08 18:04
DiamondDog hat folgendes geschrieben: |
Ich brauch doch nur das änderungs Datum der Datein im Ordner abfragen und wenn sie gleich sind wie der Backup Ordner dann passiert nix und wenn sie neu sind dann soll er die neuen Kopieren. |
Ja hab ich doch gesagt.
delphi10 - Mo 04.08.08 19:51
nagel hat folgendes geschrieben: |
Woran willst du erkennen, ob sie verändert wurden? |
MS hat mal sowas wie Fileattribute eingebaut. Nennt sich in diesem Fall Archive-Flag. VORHER alle Archiveflags löschen, dann nur die Dateien kopieren, wo das Archiveflag wieder gesetzt ist.
cu delphi10
Delete - Mo 04.08.08 21:51
weshalb vorher löschen? einfach löschen, wenn die datei archiviert wurde... dann biste immer kommplett, ausser du machst mal 'n full backup ...
delphi10 - Mo 04.08.08 22:49
Grenzgaenger hat folgendes geschrieben: |
weshalb vorher löschen? |
Ja sicher, ist richtig was du schreibst. Ich wollte nur eine definierte Ausgangssituation für @DiamondDog beschreiben.
cu delphi10
Delete - Mo 04.08.08 22:52
hier wär es wohl besser das Archiv Bit vorher zu setzen... ;-)
dann gäbs automatisch 'n full backup...
und anschliessend nur noch die incremental ... ;-)
Hidden - Mo 04.08.08 23:02
Hi,
@Flag: Imho nicht optimal, da man bei neuen Dateien im Ordner von einem zufällig gesetzten Flag ausgehen muss.
Außerdem könnte der Flag ja von anderen Programmen genutzt werden. Deshalb:
Die Daten sollen ja kopiert werden; damit hast du für jede kopierte Datei das letzte Änderungsdatum. Also jetzt mal pseudocodemäßig:
Quelltext
1: 2: 3: 4:
| for Dateien in NormalFolder do begin if NotJetExists or Date1 <> Date2 then Copy; end; |
mfG,
delphi10 - Di 05.08.08 01:10
Hidden hat folgendes geschrieben: |
Hi,
@Flag: Imho nicht optimal, da man bei neuen Dateien im Ordner von einem zufällig gesetzten Flag ausgehen muss.
|
Ist bei einer Datei das A-Flag nicht gesetzt, so wird es immer gesetzt, wenn diese Datei
- erzeugt (sowieso)
- verändert
- kopiert
- verschoben wird. Das ist systematisch, aber nicht zufällig. Und schon seit DOS3.1 und früher so.
Hidden - Di 05.08.08 18:21
Hi,
Oh, das wusste ich nicht. Trotzdem bleibt:
Hidden hat folgendes geschrieben: |
Außerdem könnte der Flag ja von anderen Programmen genutzt werden. |
Was ist denn der Vorteil des Flags gegenüber Date-Checken? @Threadsteller: Welche Größe könnte der Zielordner denn haben?
Der Flag dürfte sich ja nur auswirken, wenn er besonders groß ist(->Laufzeit)..
mfG,
delphi10 - Di 05.08.08 18:39
Hidden hat folgendes geschrieben: |
Hidden hat folgendes geschrieben: | Außerdem könnte der Flag ja von anderen Programmen genutzt werden. |
Was ist denn der Vorteil des Flags gegenüber Date-Checken?
|
Eine Abfrage der Fileattribute gegen zwei abgefragte Dateien(bzw. Ordner) nebst Zeitumrechnung und Vergleich der beiden Zeiten. Außerdem könnte bei willkürlicher Füllung des Zielordners eine Datei zufällig den gleichen Zeitstempel haben wie der Ordner-wenn die Ordnerzeit die Vergleichsbasis ist. Alle Backup-Programme(zumindest ich die kenne und benutzt habe) richten sich nach A-Flag - ist halt der Standard, alles andere ist nicht immer eindeutig.
Gruß delphi10
Hidden - Di 05.08.08 19:18
Hi,
delphi10 hat folgendes geschrieben: |
wenn die Ordnerzeit die Vergleichsbasis ist. |
Aso. Na dann hat Mikroweich diesen Ansatz ja verbockt. Oder doch nicht; die Ordnerzeit kann man ja wahrscheinlich umrechnen.
Damit läuft es eig., wie ich dachte, auf einen Zeitvorteil heraus.
Ist natürlich eine zweischneidige Sache, finde das Win-Konzept aber an dieser Stelle nicht Lupensicher -> Man könnte dann keine zwei Backup-Programme gleichzeitig verwenden, weil das eine dem anderen den Flag wegnehmen würde :?
mfG,
DiamondDog - Mi 06.08.08 09:31
Also Leute,
wenn ich jetzt mal ganz erlichbin versteh ich nach den 1000 Anworten nur noch Bahnhof.
Wäre super wenn jemand jetzt mal eine Antwort auf den Punkt bringen würde.
Dieser Pseudo Vorschalg war schon nicht schlecht:
Hidden hat folgendes geschrieben: |
Quelltext 1: 2: 3: 4:
| for Dateien in NormalFolder do begin if NotJetExists or Date1 <> Date2 then Copy; end; |
mfG, |
Eigendlich müst man ja nur beim Überschreiben das Änderungsdatum jeder Datei aus dem OrginalOrdner abfragen mit dem im BackupOrdner vergleichen und dann das kopieren was nicht gleich ist.
baka0815 - Mi 06.08.08 10:09
Wenn's ein NTFS-Dateisystem ist könnte man auch einen Hash bilden, wie
wirbeldelphi schon gesagt hat und den dann im ADS der Datei speichern. Hat eine Datei dieses Hash-ADS-Attribut noch nicht, ist sie neu. Hat sich der Hash geändert, muss sie kopiert werden.
Im Vergleich zum Prüfen des A-Flags wohl ein ziemlicher Nachteil was die Laufzeit angeht, jedoch wird diesen Hash so schnell kein Programm zurücksetzen ("attrib -a *").
Delete - Mi 06.08.08 10:12
Ein vergelich des Zeitstempels ist sehr unsicher. Wenn die Systemzeit zum Beispiel nicht stimmt, kann es schon zu Problemen kommen. Das Archivattribut ist auch nicht unbedingt sicher, da andere Programme es zurücksetzen können. Ihc würde die Dateien über einem Hash vergleichen.
DiamondDog - Mi 06.08.08 11:46
Ok das hab ich jetzt verstanden das es besser ist mit Hash zu arbeiten, als mit dem Änderungsdatum.
Weiß jemand wo ich ein gutes Tutorial dazu finde?
Hab schon einwenig gegoogelt aber nicht das richtige gefunden.
Dürften ja eigendlich nicht viele Zeilen sein, die im Code mit eingebaut werden müsten oder?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!