Probleme mit GetFileDate()

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Probleme mit GetFileDate()

Beitrag 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
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag 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...
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag 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
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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)
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag 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.
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Unergründlich sind die Wege des Windows.
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag von Agent »

@bluejoke: Passend zum namen dein comment... LOL... wenns auch kein helfender Beitrag war.
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag 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...
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag 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?
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Antworten