Probleme mit GetFileDate()
Verfasst: 18.08.2005 14:12
Tach Community.
Ich schreibe an einem Syncronisations-Programm um meinen USB-Stick zu sichern. Hierbei nutze ich u.a. auch die Procedure GetFileDate() die ich hier aus dem Forum habe. Nun foldendes Phänomen: Ich lasse einen Ordner mit einem leeren Ordner sync. Er kopiert alle DAteien. Soweit ok (war ja auch leer). Jetzt lass ich das nochmal drüberlaufen und siehe da: von 32 Dateien (die ja alle eben auch ins Ziel kopiert wurden), werden NOCHMAL 12 Dateien überschrieben, weil -angeblich- das Datum anders wäre. Ich hab mir mal den Datumsstempel per debug anzeigen lassen. In der Tat: Bei der Quelldatei wird ein anderer Datumsstempel ermittelt wie bei der Zieldatei. Die Zieldatei ist exakt 2 Sekunden diffenziert.
Die Sync. kann ich sooft ausführen wie ich will. Immer die selben Dateien - verschiendenen Typs und Größe usw...
Muss ich das verstehen???
hier Proc #1:
Und hier der Programm-Auszug dazu:
Ich schreibe an einem Syncronisations-Programm um meinen USB-Stick zu sichern. Hierbei nutze ich u.a. auch die Procedure GetFileDate() die ich hier aus dem Forum habe. Nun foldendes Phänomen: Ich lasse einen Ordner mit einem leeren Ordner sync. Er kopiert alle DAteien. Soweit ok (war ja auch leer). Jetzt lass ich das nochmal drüberlaufen und siehe da: von 32 Dateien (die ja alle eben auch ins Ziel kopiert wurden), werden NOCHMAL 12 Dateien überschrieben, weil -angeblich- das Datum anders wäre. Ich hab mir mal den Datumsstempel per debug anzeigen lassen. In der Tat: Bei der Quelldatei wird ein anderer Datumsstempel ermittelt wie bei der Zieldatei. Die Zieldatei ist exakt 2 Sekunden diffenziert.
Die Sync. kann ich sooft ausführen wie ich will. Immer die selben Dateien - verschiendenen Typs und Größe usw...
Muss ich das verstehen???
hier Proc #1:
Code: Alles auswählen
Procedure GetFileDate(file$); - Get the time of a File
handle=CreateFile_(@file$,#GENERIC_READ,#FILE_SHARE_READ|#FILE_SHARE_WRITE,0,#OPEN_EXISTING,#FILE_ATTRIBUTE_NORMAL,0)
If handle<>#INVALID_HANDLE_VALUE
GetFileTime_(handle,0,0,FT.FILETIME)
;Result=FileTimeToDate(FT)
CloseHandle_(handle)
FileTimeToLocalFileTime_(FT.FILETIME,FT2.FILETIME)
FileTimeToSystemTime_(FT2,st.SYSTEMTIME)
ProcedureReturn Date(st\wYear,st\wMonth,st\wDay,st\wHour,st\wMinute,st\wSecond)
Else
ProcedureReturn 0
EndIf
EndProcedure
Und hier der Programm-Auszug dazu:
Code: Alles auswählen
anzahl_source_files=CountList(SourceDir())
filecount=0
While NextElement(SourceDir())
filecount+1
If nowin=#False
SetGadgetState(#main_progressbar, (filecount*100)/anzahl_source_files)
SetGadgetText(#main_text_progress,Str((filecount*100)/anzahl_source_files)+"%")
EndIf
sourcefile$=Right(SourceDir()\entryname$,Len(SourceDir()\entryname$)-Len(sourcedir$)) ; Laufwerksbuchstaben und : enfernen
targetfile$=targetdir$+sourcefile$
If FileExists(targetfile$) ; Datei vorhanden
SourceDir()\entrydate=GetFileDate(SourceDir()\entryname$)
If SourceDir()\entrydate=GetFileDate(targetfile$) ; Datum gleich?
If compare_md5=#True
SourceDir()\entryMD5$=MD5FileFingerprint(SourceDir()\entryname$)
If SourceDir()\entryMD5$<>MD5FileFingerprint(targetfile$) ; MD5-Key gleich?
logtext$+"- File: "+SourceDir()\entryname$+#CR$
logtext$+"--- MD5-Fingerprint geändert"+#CR$
AddElement(CopyList$())
CopyList$()=SourceDir()\entryname$
If nowin=#False
SetGadgetText(#main_string_differentfiles,Str(Val(GetGadgetText(#main_string_differentfiles))+1))
EndIf
EndIf
EndIf
Else ; Datum ungleich!
logtext$+"- File: "+SourceDir()\entryname$+#CR$
logtext$+"--- Datum geändert"+#CR$
AddElement(CopyList$())
CopyList$()=SourceDir()\entryname$
If nowin=#False
SetGadgetText(#main_string_differentfiles,Str(Val(GetGadgetText(#main_string_differentfiles))+1))
EndIf
EndIf
Else ; Datei auf Ziel nicht gefunden!
AddElement(CopyList$())
CopyList$()=SourceDir()\entryname$
If nowin=#False
SetGadgetText(#main_string_differentfiles,Str(Val(GetGadgetText(#main_string_differentfiles))+1))
EndIf
EndIf
If getasynckeystate_(#VK_ESCAPE)=-32767
LastElement(SourceDir())
MessageRequester(#sw_name,"Benutzer-Abbruch",0)
EndIf
Wend