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 // target available
      pTo := nil;
    end// target not available
    fFlags := Flags;
  end// structure
  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

user profile iconDiamondDog 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

user profile iconnagel 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

user profile iconGrenzgaenger 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

user profile iconHidden 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:
user profile iconHidden 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

user profile iconHidden hat folgendes geschrieben:


user profile iconHidden 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,

user profile icondelphi10 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:
user profile iconHidden 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 user profile iconwirbeldelphi 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?


jaenicke - Mi 06.08.08 13:04

Du findest z.B. hier eine entsprechende Unit:
http://www.delphi-forum.de/viewtopic.php?p=239742#239739