| Autor |
Beitrag |
D. Annies
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Di 28.10.08 10:21
Hi, Delpher,
in meinem Programm arbeite ich mit zwei Laufwerken. Die Dateien, die verändert oder neu erstellt werden, können dann am Ende der Arbeit auf Nachfrage auf dem jeweils anderen Laufwerk gesichert werden (wie eine Synchronisation).
nach der Zeitumstellung passiert es lästigerweise, dass mein Programm alle gesicherten / zu sichernden Dateien als verändert erkennt - weil es ein anderer Zeitstempel ist - obwohl ich mit der Datei nichts gemacht habe (sie also nicht aufgerufen / verändert habe) - nur ein Zeitunterschied von einer Stunde wird angemeckert und dann ist die Datei neu zu sichern. Das möchte ich vermeiden, weil ja nichts verändert wurde.
Was ist da zu tun?
Gruß, Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 28.10.08 10:38
|
|
Logikmensch
      
Beiträge: 390
Win XP
Delphi 2007 Prof., XE2, XE5
|
Verfasst: Di 28.10.08 10:44
Ich kann nur empfehlen, nicht den Zeitstempel alleine dafür zu verwenden, ob eine Datei verändert wurde oder nicht. Besser ist es z.B. eine CRC32-Prüfsumme drüberlaufen zu lassen. Nur wenn die der Quelle und dem Ziel identische Prüfsummen haben, kann man fast 100%ig davon ausgehen, dass die Dateien identisch sind.
_________________ Es gibt keine Probleme - nur Lösungen!
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 28.10.08 10:48
Außerdem gibt es ja noch das Archiv-Attribut, wenn man auf Prüfsummen verzichten will.
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Di 28.10.08 10:49
Dank dir erstmal, Namensvetter, ich melde mich wieder...
Gruß, Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Di 28.10.08 12:20
Uff, uff, ich blicke noch nicht durch.
Hier ist mal der Code, mit dem ich entscheide, ob eine Datei zu sichern ist oder nicht.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| if fileexists(Pr_FileName) then begin if FileDateToDateTime(FileAge(Pr_FileName)) <> FileDateToDateTime(FileAge(existingfilename)) then begin erg := xmessagedlg('Soll ' + pr_filename+ ' '+#13+ datetimetostr(filedatetodatetime(FileAge(Pr_Filename))) +#13+ 'durch ' + existingfilename + ' '+#13+ datetimetostr(filedatetodatetime(FileAge(ExistingFileName))) +#13+ ' ersetzt werden?', mtConfirmation, [mbYes, mbno, mbcancel], ['ja', 'nein', 'Abbrechen'], self.font);
case erg of mryes : CopyFile(PChar(ExistingFileName), PChar(Pr_FileName), FALSE); mrcancel : raus := true; end; end; end |
Ist so etwas leichter zu erkennen, was ich verändern / ergänzen muss?
Gruß, Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 28.10.08 12:23
Hast Du mal das Archiv-Attribut geprüft?
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Di 28.10.08 12:42
Uff, jetzt habe ich den folgenden Code (aus der Hilfe) gefunden: [aber keinen Plan]
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: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| procedure TFMForm.Properties1Click(Sender: TObject); var Attributes, NewAttributes: Word; begin with FileAttrForm do begin FileDirName.Caption := FileList.Items[FileList.ItemIndex]; PathName.Caption := FileList.Directory; ChangeDate.Caption := DateTimeToStr(FileDateToDateTime(FileAge(FileList.FileName))); Attributes := FileGetAttr(FileDirName.Caption); ReadOnly.Checked := (Attributes and faReadOnly) = faReadOnly; Archive.Checked := (Attributes and faArchive) = faArchive; System.Checked := (Attributes and faSysFile) = faSysFile; Hidden.Checked := (Attributes and faHidden) = faHidden; if ShowModal <> id_Cancel then begin NewAttributes := Attributes; if ReadOnly.Checked then NewAttributes := NewAttributes or faReadOnly else NewAttributes := NewAttributes andnot faReadOnly; if Archive.Checked then NewAttributes := NewAttributes or faArchive else NewAttributes := NewAttributes andnot faArchive; if System.Checked then NewAttributes := NewAttributes or faSysFile else NewAttributes := NewAttributes andnot faSysFile; if Hidden.Checked then NewAttributes := NewAttributes or faHidden else NewAttributes := NewAttributes andnot faHidden; if NewAttributes <> Attributes then FileSetAttr(FileDirName.Caption, NewAttributes); end; end; end; |
Idee?
_________________ ut vires desint, tamen est laudanda voluntas
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 28.10.08 12:59
Delphi-Quelltext 1: 2:
| if (FileGetAttr(Dateiname) and faArchive) = faArchive then ShowMessage('Archivattribut gesetzt'); |
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Di 28.10.08 13:43
gut, aber eine showmessage verändert ja noch nichts. Was kann man denn am Archiv-Attribut überhaupt erkennen?
_________________ ut vires desint, tamen est laudanda voluntas
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 28.10.08 14:04
Das Archiv-Attribut wird vom OS bei Dateiänderungen gesetzt.
|
|
Agawain
      
Beiträge: 460
win xp
D5, MySQL, devxpress
|
Verfasst: Di 28.10.08 14:20
hi
hier eine ausführliche Erklärung
de.wikipedia.org/wiki/Archivbit
_________________ Gruß Aga
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 28.10.08 15:13
DeddyH hat folgendes geschrieben : | | Das Archiv-Attribut wird vom OS bei Dateiänderungen gesetzt. |
darauf würde ich mich aber auch nicht verlassen, da man dieses archivbit auch aus Anwendungen setzen und löschen kann. Nero löscht es zum beispiel, wenn die Dateiu gebrannt wurde.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 28.10.08 15:23
Das ist ja auch der angedachte Zweck dieses Attributs. Backupprogramme sollen es auswerten, die Datei ggf. sichern und das Attribut anschließend löschen.
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Di 28.10.08 15:32
Vielen Dank erstmal! Nun dauerts nicht mehr lange bis zur Lösung.
So, jetzt habe ich den folgenden Code:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| if (FileDateToDateTime(FileAge(Pr_FileName)) <> FileDateToDateTime(FileAge(existingfilename)) and ((FileGetAttr(Pr_FileName) and faArchive) = faArchive) then begin erg := xmessagedlg('ArchivBit wurde gesetzt' +#13 + 'Soll ' + pr_filename+ ' '+#13+ datetimetostr(filedatetodatetime(FileAge(Pr_Filename))) +#13+ 'durch ' + existingfilename + ' '+#13+ datetimetostr(filedatetodatetime(FileAge(ExistingFileName))) +#13+ ' ersetzt werden?', mtConfirmation, [mbYes, mbno, mbcancel], ['ja', 'nein', 'Abbrechen'], self.font);
|
aber ich bekomme die Fehlermeldung:
Operator ist auf diesen Operandentyp nicht anwendbar.
(und die Warnung: ... plattformspezifisch [aber das ist ja nur eine Warnung])
Was ist noch falsch?
_________________ ut vires desint, tamen est laudanda voluntas
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 28.10.08 15:38
Eine Klammer zu wenig:
Delphi-Quelltext 1: 2:
| if (FileDateToDateTime(FileAge(Pr_FileName)) <> FileDateToDateTime(FileAge(existingfilename))) and ((FileGetAttr(Pr_FileName) and faArchive) = faArchive) then |
So müsste es klappen. Die Warnung von wegen plattformspezifisch kannst Du getrost ignorieren, es sei denn, Du willst mit Kylix für Linux entwickeln.
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Di 28.10.08 15:46
Hi, Deddy,
jo, habe ich auch gerade gesehen, dass in der ersten Bedingung eine äußere Klammer fehlte - nun denn mal (wieder) herzlichen Dank für deine (eure) Bemühungen!
Bis zum nächsten Mal,
Detlef A.
_________________ ut vires desint, tamen est laudanda voluntas
|
|
baka0815
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: Di 28.10.08 16:53
Wie Lucky aber bereits gesagt hat, können auch andere Anwendungen das Archiv-Bit zurücksetzen.
Wenn Nero das macht, wie Lucky sagt, würden die Daten nicht mehr gesichert, sobald Nero die gebrannt hat (weil ja bereits von Nero "gesichert").
Auf der sicheren Seite wärst du (meiner Meinung nach), wenn du die Dateigröße und einen Hash (MD5, SHAx, etc.) miteinander vergleichst - dürfte dann nur länger dauern, da zu jeder Datei der Hash gebildet werden muss.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 28.10.08 17:02
DeddyH hat folgendes geschrieben : | | Das ist ja auch der angedachte Zweck dieses Attributs. Backupprogramme sollen es auswerten, die Datei ggf. sichern und das Attribut anschließend löschen. |
Das Problem ist nur, dass sich zwei Programme in die Quere kommen können, wenn sie sich auf das Archivbit verlassen.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 28.10.08 17:06
Was sagst Du mir das? Das ist Microsofts Idee gewesen.
|
|