Dateigröße wird nicht erkannt/aktualisiert

  • Hallo erstmal,
    ich weiß nicht, ob hier das richtige Forum für mein Problem ist, aber ich hoffe, dass mir jemand helfen kann:
    ich habe mit Autoit ein Programm geschrieben, dass Dateien verschlüsselt und abspeichert.
    Der Fortschritt-Balken bei der Verschlüsselung entspricht dem Verhältnis von der verschlüsselten Datei zu der Datei, die verschlüsselt werden soll,
    da ich keine Ahnung hatte, wie ich den Fortschritt-Balken sonst realisieren soll;
    die Dateigrößen von verschlüsselter und nicht verschlüsselter Datei sind nahezu identisch, daher schien mir diese Möglichkeit akkurat genug,
    falls jemand eine elegantere Möglichkeit weiß, bin ich offen für Vorschläge :)
    Nun aber zu meinem eigentlichen Problem:
    Die Dateigröße der von meinem Script erstellten Datei wird nicht automatisch aktualisiert, erst wenn ich das entsprechende Verzeichnis aufrufe und "aktualisieren" wähle, erkennt Autoit die Dateigröße.
    Upgedatet wird sie auch nur, wenn ich manuell ständig aktualisiere.
    Der Windows Explorer aktualisiert die Dateigröße auch nicht automatisch.

    Die Verschlüsselung erfolgt mit Methoden der Crypt.au3 und dem AES 256
    Die Abfrage der Dateigrröße erfolgt durch die Methode FileGetSize(..)

    Wie bekomme ich Autoit dazu die Dateigröße richtig zu erkennen oder den Explorer dazu sie automatisch zu aktualisieren?
    So ist mein Fortschrittbalken doch total doof :/

    Verzweifelte Grüße
    Schweizergeizer

  • Weißt du was ein Minimalbeispiel ist?
    Das ist ein Skript welches so klein wie möglich ist und von allem unnötigen befreit wurde aber das angesprochene Verhalten reproduziert.
    Es sollte ohne weitere nötige Anpassungen direkt bei jedem lauffähig sein.

    Das hat den Riesenvorteil, dass dir schneller und besser geholfen werden kann und oftmals du beim Erstellen eines solchen Beispiels selbst auf die Lösung stößt.
    Wenn du ein solches Beispiel hierzu postest wirst du sicherlich schnell Hinweise bekommen.

  • hier ein kleines Beispielprogramm:


    Zur Verdeutlichung habe ich eine 4gb große Textdatei genommen,
    diese ist komprimiert im Anhang zu finden.
    test.rar

    Ich erhalte trotz stetig wachsender Dateigröße in der Konsole nach der ersten Zeile mit 0 Bytes immer die gleiche Ausgabe, wie im Screenshot im Anhang sichtbar.

    Die angezeigte Dateigröße ändert sich erst, wenn ich den Pfad zur Datei aufrufe und mit dem Explorer aktualisiere.

    Ich habe keine Ahnung was ich tun soll und bin über jede Antwort dankbar

    LG
    Schweizergeizer

  • FileWrite schreibt nicht direkt auf die Festplatte, sondern in einen Puffer.
    Dieser wird erst dann in einen Rutsch auf die Platte geschrieben wenn das Dateihandle geschlossen wird oder der Puffer voll ist.
    Filegetsize lügt also gar nicht wenn es sagt die Datei ist 0 Bytes groß, denn zu diesem Zeitpunkt befinden sich die Daten noch im Puffer.

    Zur Lösung: Eine Möglichkeit ist es nach jedem Schreibvorgang ein FileFlush() zu setzen. Das erzwingt das Leeren des Puffers auf die Festplatte.
    Das ist aber nicht wirklich effektiv.
    Stattdessen ist es sinnvoller die Größe der bereits verarbeiteten Daten zu merken und dann auf diese zuzugreifen:

    Spoiler anzeigen