Seite 1 von 3

Probleme mit GetFileDate()

Verfasst: 18.08.2005 14:12
von Agent
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:

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

Verfasst: 18.08.2005 14:50
von Agent
Hier zum Spaß mal der Debug-Output:
C:\test\AJCKDCBH: 1122889402 <> 1122889404
C:\test\Eraser\Eraser57Setup.zip: 1105958968 <> 1105958970
C:\test\folder1\folder2\FBZADMIN.INI: 1103822879 <> 1103822880
C:\test\folder1\folder2\folder3\dasetup.log: 1105796045 <> 1105796046
C:\test\folder1\folder2\folder3\folder4\COM+.log: 1112870574 <> 1112870576
C:\test\folder1\folder2\folder3\folder4\soldat.ini: 1123593152 <> 1123593154
C:\test\folder1\folder2\folder3\mapslist.txt: 1123593152 <> 1123593154
C:\test\folder1\folder2\folder3\mp3list.txt: 1123593062 <> 1123593064
C:\test\folder1\folder2\folder3\remote.txt: 1123593151 <> 1123593152
C:\test\folder1\folder2\INSTALL.ARR: 1104748849 <> 1104748850
C:\test\Fraps\FRAPS264.EXE: 1124183739 <> 1124183740
C:\test\net-sk-neu.bat: 1123065415 <> 1123065416
Debug ist:
"Quellname Quelldatum <> Zieldatum"

Zur Info: Die Dateien werden per einfachem Copyfile(quelle, ziel) kopiert. Nichts weiter modifiziert.

PS: Vielleicht ist das auch ein Prob der Beta-Version??? Ich lad mal die Final grad...

Verfasst: 18.08.2005 15:55
von Agent
Unglaublich. Dies hat jetzt nichts mehr mit PB direkt zu tun. Ich hab die final von heute installiert. Keine Besserung (nur zur info - lag nicht an der Beta).

Bei meinem Test oben, habe ich von c:\test\ nach d:\test2\ sync. Dort -wie gasagt- eine kleine Anzahl Dateien, die IMMERWIEDER mit angeblich anderem Datum vorhanden sind. Egal wieoft ich es aufgeführt habe: Die gleichen Dateien.

Jetzt das unerklärliche:
Ich gebe als Ziel c:\test2\ (anstatt D:) ein...und siehe da: ES GEHT.
Warum,wieso und weshalb ist die 2.Partition (D:) zeitversetzt???? Und das nur für eine Hand voll Dateien???

Ich erwarte nicht wirklich Antworten darauf *LOL*

Aber ihr müsst zugeben: Ein seeeehr seltsames Ergebnis.
Wichtig ist: Die routine geht :P

Verfasst: 18.08.2005 16:12
von ts-soft
Du solltest nach erfolgtem Kopiervorgang einer Datei das von Dir ausgewertete Datum neusetzen. Ansonsten wirste immer wieder Unterschiede feststellen, je nach Geschwindigkeit (USB usw.), je nach Dateisystem usw.

Verfasst: 18.08.2005 16:21
von bobobo
Außerdem ist das Datum alleine eh kein echtes Kriterium ob die Dateien unterschiedlich sind.

Vergleich doch mal die Dateien (zusätzlich) anhand eines MD5-FileFingerprints (is ne PB-Funktion)

Verfasst: 18.08.2005 20:40
von Agent
@Bobobo: Ist klar. Ich vergleiche auch (siehe Code) nach MD5. Je nach dem, da MD5 viel länger dauert.

Was das Datum betrifft. Das Datum wird von CopyFile doch gar nicht berührt. Sonst wäre es ja jedesmal das aktuelle Datum nach Kopiervorgang. Außerdem würde das Programm dann ja ALLE Dateien anmeckern, da die ja dann logischerweise alle ein anderes Datum hätten wie die Ursprungsdatei.

Verfasst: 19.08.2005 11:02
von bluejoke
Unergründlich sind die Wege des Windows.

Verfasst: 19.08.2005 11:09
von Agent
@bluejoke: Passend zum namen dein comment... LOL... wenns auch kein helfender Beitrag war.

Verfasst: 19.08.2005 11:12
von bluejoke
Ich wollte damit sagen, dass CopyFile anscheinend eben doch ab und zu die Zeiten verändert - hast du ja selbst heruasgefunden. Wahrscheinlich vor Allem dann, wenn der Kopiervorgang länger dauert. Deshalb machs einfach so, wie dir schon geraten wurde: Lies die Zeit aus der Originaldatei und setze diese nach dem Kopieren. Das ist doch kaum Aufwand.
Vor Allem aber: Warte nicht auf Erklärungen, die dir wahrscheinlich niemand liefern kann, denn wie gesagt: Unergründlich sind...

Verfasst: 19.08.2005 11:21
von Agent
Auch wenn ich es nicht wirklich glauben will. Obwohl man es bei WinDoof ja nieee weiß - da haste recht.

Das Datum nach dem kopieren zu setzen schwirrt mir auch im Kopf rum. Das wird aber wieder Geschwindigkeit kosten, die sich bei (evtl.) hunderten oder tausenden Dateien am Ende ganz schön summiert (zeitlich). Außerdem hab ich noch keine Idee wie ich das machen soll (gefunden auch nix)...mal im CodeArchiv nachsehen...

PS:
Was am Rande:
Das Sync-Proggy das ich schreibe, lässt sich inspirieren von einer Freeware namens verzeichnissyncronizer. Interessant ist, verzsync liest wahnsinnig schnell mal eben 40000 dateien ein, das ReadDir() aus PB (über examinedirectory und nextdirectory..) braucht eeeewig länger. Auch wenn ich NUR den Namen des Eintrags lese (keine Größe oder sonstwas)!

PPS: Speedtest:
Ich habe bisher FileSize() benutzt, um die Dateigröße zu ermitteln. Dieser Befehl ist da hundertmal langsamer als eine über examinedirectory und anschliessendem directoryentrysize berechnete Dateigröße oO

Es wäre cool, wenn es einen Thread gebe, der schnellere Procedures vergleicht.....Denn Speed ist doch heutzutage wichtig ... --- .. Oder?