Autor |
Beitrag |
DiamondDog
      
Beiträge: 460
|
Verfasst: Mo 04.08.08 15:20
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
      
Beiträge: 708
Win7, Ubuntu 10.10
|
Verfasst: 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 
      
Beiträge: 460
|
Verfasst: 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
      
Beiträge: 29
|
Verfasst: Mo 04.08.08 17:49
Ich würd von jeder Datei einen Hashwert speichern. MD5 wär z.B. perfekt.
_________________ Ich bin keine Signatur - ich putz hier nur.
|
|
nagel
      
Beiträge: 708
Win7, Ubuntu 10.10
|
Verfasst: 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
      
Beiträge: 447
Erhaltene Danke: 2
W2K, XP, Vista64, Win7 64
RAD-Studio 2010
|
Verfasst: 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
_________________ Salus populi suprema lex esto
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 447
Erhaltene Danke: 2
W2K, XP, Vista64, Win7 64
RAD-Studio 2010
|
Verfasst: 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
_________________ Salus populi suprema lex esto
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: 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,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
delphi10
      
Beiträge: 447
Erhaltene Danke: 2
W2K, XP, Vista64, Win7 64
RAD-Studio 2010
|
Verfasst: 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.
_________________ Salus populi suprema lex esto
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: 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,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
delphi10
      
Beiträge: 447
Erhaltene Danke: 2
W2K, XP, Vista64, Win7 64
RAD-Studio 2010
|
Verfasst: 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
_________________ Salus populi suprema lex esto
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: 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,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
DiamondDog 
      
Beiträge: 460
|
Verfasst: 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
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: 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 *").
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 460
|
Verfasst: 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?
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 06.08.08 13:04
Du findest z.B. hier eine entsprechende Unit:
www.delphi-forum.de/....php?p=239742#239739
|
|