Juli 12, 2020, 19:01:04

Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!


Shell: Folderitem

Begonnen von crystal, Mai 14, 2020, 18:45:46

⏪ vorheriges - nächstes ⏩

crystal

Hallo!
Ich lese mittels shell32 aus Dateien deren Größe mit ...FolderItem(1)... aus.
Es werden Strings wie "456 KB", "45,6 KB", "1,02 GB" usw. zurück gegeben.

Wie kann ich diese Angaben z.B. in KB umrechnen (im ersten Beispiel trivial)?
Und was bedeuten die Nachkommastellen z.B. in "1,02 GB"? Sind das 2 Megabyte oder 0,02*1024 MB?
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

crystal

Oh - schon selbst gelöst:
...FolderItem.Size gibt die Größe in Bytes an.
Die muss man dann nur noch teilen und erhält z.B. MB (hier ohne Nachkommastellen):

SizeMB = ...FolderItem.Size \ 1024 \ 1024
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

crystal

Leider doch nicht gelöst.

Bei einer Dateigröße von z.B. 2,13 GB gibt .Size den Wert -2005743837 zurück.

Wie muss ich das umrechnen?
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

crystal

Mai 14, 2020, 21:14:36 #3 Letzte Bearbeitung: Mai 16, 2020, 21:49:43 von crystal
Es geht wohl so:
            v = objFolderItem.Size
            If v < 0 Then
                v = v + 2 ^ 32
            End If
            FileSizeMB = Val(v / 1024 \ 1024)

Anmerkung:
            FileSizeMB = Val(v \ 1024 \ 1024) bringt einen Überlauf-Fehler obwohl v als Variant deklariert ist

Frage:
Ist das so OK? Oder gibt es eine bessere Lösung?

Es scheint so zu sein, das .Size des FolderObjects die Größe der Datei in Bytes in einem 4-Byte-breiten Feld zurückgibt (4*8, 2^32). Ab ca. 2GB wird es dann negativ. Was passiert bei Dateien, die 4 oder 8 GB groß sind???

Deshalb nochmal meine Frage:
Gibt es eine bessere Lösung?
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!