FileSetTime arbeitet ungenau

  • Hallo

    Mir ist bei der Arbeit mit der Funktion FileSetTime aufgefallen, dass irgendwie am Ende die Dateien nicht das Datum haben, wie sie es haben sollten

    also ich mache grob folgendes:

    [autoit]


    FileSetTime($Desti,FileGetTime($Source,0,1),0)

    [/autoit]

    Dabei ist Source halt die Datei, von der das Datum genommen werden soll und Desti, die Datei die dann am Ende das gleiche Datum haben soll, wie Source.
    Allerdings kommt es vor, das genau das eben am Ende nicht der Fall ist.
    Hab mir das Datum das FileGetTime holt auch schon angeschaut, das stimmt, nur die Datei hat am Ende halt das falsche Datum
    meistens ist es um 2 Sekunden aufgerundet

    kann mir den Effekt nicht erklären

    Danke schon ma

    gruß
    Ceenen

  • Es ist auch nicht bei jeder Datei sondern bei 2.000 Dateien 15 bei denen es nicht stimmt.
    Kann aber auch nicht sagen, was bei den Dateien anders ist, als bei denen wo es geht

  • [autoit]


    if(FileGetTime($Source,0,1)<>FileGetTime($Desti,0,1)) Then
    FileSetTime($Desti,FileGetTime($Source,0,1),0)
    MsgBox("","",FileGetTime($Source,0,1))
    MsgBox("","",FileGetTime($Desti,0,1))
    EndIf

    [/autoit]

    Das ganze steckt in ner Schleife, die alle Dateien in einem Ordner und dessen Unterordner durchsucht.

    Source und Desti liegen in 2 unterschiedlichen Ordnern.
    Definitiv kann ich es im mom sagen, wenn ein Ordner auf der Festplatte liegt und der andere auf meinem Usb Stick

    Und an dieser Stelle zeigen die beiden MsgBoxen 2 unterschiedliche Werte an
    Die Zeiten von Source sind soweit ich gesehen habe immer am ende mit 8, also jjjjmmddhhm8, zb also 20070906184538, das wird dann zu 20070906184540

    UPDATE:
    also ich habs jetzt nochmal genauer angeschaut
    Der effekt scheint nur beim USB Stick aufzutreten, und die gesetzte Zeit ist immer 1-2 sekunden später als der von der Urspungsdatei
    Bei Festplatte auf Festplatte kommen korrekte Werte raus

    Einmal editiert, zuletzt von Ceenen (7. September 2007 um 22:50)

  • also es tritt generell auf, das ist mir nur nicht aufgefallen, weil ich die dateien vorher manuell kopiert hatte, in dem fall stimmte das datum

    nun haben sich manche dateien geändert, somit neues datum, und dabei tritt es immer auf

    hab noch ein wenig rumprobiert, also von festplatte auf festplatte geht, festplatte zu netzlaufwerk geht, nur auf den usb stick nicht, dort wird jedes datum falsch gesetzt, meist 2, teilweise eine sekunde

    • Offizieller Beitrag

    Hallo,

    das liegt wahrscheinlich am Filesystem auf dem USB-Stick, der ist bestimmt mit Fat32 formatiert. Bei den Fat-Filesystemen hat die Dateizeit eine Genauigkeit von 2 Sekunden, bei NTFS sind es 100 Nanosekunden. Kannst ja mal probieren den Stick mit NTFS zu formatieren und schauen ob sich das Problem damit lösen lässt.

  • das hört sich plausibel an, werd ich mal versuchen
    wusste ich noch gar nicht, dass fat32 da so ungenau ist

    thx

    • Offizieller Beitrag

    Das hat man damals gemacht um die Zeit mit 12 Bits zu speichern, dadurch hatte man 4 Bits für andere Aufgaben zur Verfügung! Speicher war zu der Zeit noch richtig teuer!

  • stimmt
    da wurden ja jahreszahlen noch nur 2 ziffern gespeichert :)

    nun ist aber die frage, wie könnt ich das umgehen, auch bei fat32?

    hatte auch zwischndurch eingebaut, das nur abgeglichen wird, wenn die differenz zw den 2 datumsangaben >2 ist
    das funktioniert aber bei minuten oder stundenwechsel nicht

    irgendeine schnelle idee, außer die wirkliche sekundendifferenz zu berechnen?

  • Also ich habe mal Bernd seine Tehorie geprüft.
    Es stimmt mit den FAT32 und ich kann auch nur sagen, das bei der Menge an Daten es sein kann, das die Zeit von einer mInute in die nächste springt, da die erste Minute gerade ihre 60 Sekunden hinter sich hat. Bei kleineren Mengen istd as ganze nicht so, auch nicht im Bereich der FAT32. Also sind zwei Faktoren zu beachten. A) FAT32 udn B9 die angefangene Minute, die bei 2K an Datenmenge leicht umspringen kann.

    Gruss, Lina.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

  • also den faktor menge der daten würde ich ausschließen, da die zeistempel bei den dateien während der laufzeit eigentlich nicht verändert werden und zu dem jeder zeitstempel direkt vor dem ändern gelesen wird
    auf ntfs läuft das programm problemlos über 300.000 dateien, und dabei stimmt jedes datum

    morgen werde ich noch mal ein bisschen rumspielen, weil ich glaube wenn ich mit windows datien auf den stick kopiere stimmen die daten glaube ich, muss ich morgen ma verifizieren


    btw
    thx für die schnelle hilfe hier :)


    UPDATE:

    Also habe jetzt den Zeitvergleich mit _DateDiff(...) mit maximal 2 Sekunden unterschied gemacht, wenn nicht beide Laufwerke NTFS sind.
    Scheint auch soweit alles ganz gut zu klappen :)

    Lösung sieht im Ausschnitt dann so aus:

    Spoiler anzeigen
    [autoit]


    If(DriveGetFileSystem(StringLeft($Source,3))="NTFS" And DriveGetFileSystem(StringLeft($Destination,3))="NTFS") Then
    $FileTimeDiff=0
    Else
    $FileTimeDiff=2
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If($FileTimeDiff>0) Then
    $STime=FileGetTime($Source,0)
    $DTime=FileGetTime($Desti,0)
    $STimeS=$STime[0] & "/" & $STime[1] & "/" & $STime[2] & " " & $STime[3] & ":" & $STime[4] & ":" & $STime[5]
    $DTimeS=$DTime[0] & "/" & $DTime[1] & "/" & $DTime[2] & " " & $DTime[3] & ":" & $DTime[4] & ":" & $DTime[5]
    if(_DateDiff("s",$STimeS,$DTimeS)>$FileTimeDiff) Then
    Return True
    EndIf
    Else
    If(FileGetTime($Source,0,1)<>FileGetTime($Desti,0,1)) Then
    Return True
    EndIf
    EndIf

    [/autoit]

    Einmal editiert, zuletzt von Ceenen (9. September 2007 um 22:29)