Autor Beitrag
DiamondDog
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 708

Win7, Ubuntu 10.10

BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 29



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 708

Win7, Ubuntu 10.10

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 447
Erhaltene Danke: 2

W2K, XP, Vista64, Win7 64
RAD-Studio 2010
BeitragVerfasst: 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

_________________
Salus populi suprema lex esto
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 447
Erhaltene Danke: 2

W2K, XP, Vista64, Win7 64
RAD-Studio 2010
BeitragVerfasst: 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

_________________
Salus populi suprema lex esto
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 447
Erhaltene Danke: 2

W2K, XP, Vista64, Win7 64
RAD-Studio 2010
BeitragVerfasst: 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.

_________________
Salus populi suprema lex esto
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: 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,

_________________
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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 447
Erhaltene Danke: 2

W2K, XP, Vista64, Win7 64
RAD-Studio 2010
BeitragVerfasst: 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

_________________
Salus populi suprema lex esto
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: 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,

_________________
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: 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 *").
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 460



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 06.08.08 13:04 
Du findest z.B. hier eine entsprechende Unit:
www.delphi-forum.de/....php?p=239742#239739