Seite 1 von 2
Problem mit GetDiskFreeSpaceEx_()
Verfasst: 07.08.2006 02:54
von AND51
Hallo!
Ich versuche mich gerade an der API Funktion
GetDiskFreeSpaceEx_().
Ziel: Den verfügbaren freien Spicherplatz des Laufwerks, die Speicherkapazität des Laufwerks und den belegten Speicher des Laufwerks
in Byte zu ermitteln.
Mein Code:
Code: Alles auswählen
Structure abc
long1.l
long2.l
EndStructure
GetDiskFreeSpaceEx_(@"C:\", a.abc, b.abc, c.abc)
Frage: Ich fand heraus, dass man die Structure braucht. a\long1 gibt mir dann den freien Speicherplatz in Byte, mehr finde ich aber nicht heraus.
Kann mir hier jemand helfen und explizit sagen b\long2 sagt dir ... und c\long1 sagt dir, dass... usw.
Und: funktioniert das auch mit CD-ROMs, DVs, Netzlaufwerken, etc.?
Und: Gibt's da nicht bald ein Buffer-Overflow, wenn ich die Anzahl Bytes einer 320 GB Festplatte ermittle? Wenns sein muss, können die Ergebnisse auch in eine Float-variable vorliegen, das ist mir egal (Float hat doch unbegrenzt hohe Zahlen, oder?).
Danke für eure Mühe!

Verfasst: 07.08.2006 03:32
von ts-soft
Für 3.94 wirste im CodeArchiv fündig
Für 4.0
Code: Alles auswählen
Enumeration
#FreeBytesAvailable
#TotalNumberOfBytes
#TotalNumberOfFreeBytes
EndEnumeration
Procedure.q GetDiskFreeSpace(Drive.s, Flag.l = 0)
Protected FreeBytesAvailable.q, TotalNumberOfBytes.q, TotalNumberOfFreeBytes.q
If GetDiskFreeSpaceEx_(@Drive, @FreeBytesAvailable, @TotalNumberOfBytes, @TotalNumberOfFreeBytes)
Select Flag
Case #FreeBytesAvailable
ProcedureReturn FreeBytesAvailable
Case #TotalNumberOfBytes
ProcedureReturn TotalNumberOfBytes
Case #TotalNumberOfFreeBytes
ProcedureReturn TotalNumberOfFreeBytes
EndSelect
EndIf
ProcedureReturn #False
EndProcedure
Available.q = GetDiskFreeSpace("C:\")
Total.q = GetDiskFreeSpace("C:\", #TotalNumberOfBytes)
Free.q = GetDiskFreeSpace("C:\", #TotalNumberOfFreeBytes)
Verfasst: 07.08.2006 13:20
von AND51
Hallo!
Ich habe nun im Code *reschärschiert* aber nichts (passendes) gefunden. Da werden die Operatoren << und >> verwendet. Damit habe ich mich aber noch nie befasst und weiß nicht so recht, was sie bedeuten. Das aus der Hilfe klingt für mich leider ein bisschen schwer.
Also habe ich mich hingesetzt und experimentiert.
Ist denn das richtig, was ich mir ausgedacht habe:
x << y ist dasselbe wie
x*2^y (x mal 2 hoch y)
Dann weiß ich ja wenigstens schon mal, was << und >> bedeuten. Aber ich weiß immernoch nicht, was dieser Codesalat hier soll
Code: Alles auswählen
; calculate sizes in mb.
TotalMB = ((TotalBytes\Long1 >> 20) & $FFF) | (TotalBytes\Long2 << 12)
FreeMB = ((TotalFreeBytes\Long1 >> 20) & $FFF) | (TotalFreeBytes\Long2 << 12)
und außerdem möchte ich das Resultat ja in Bytes haben, nicht in MB.
Verfasst: 07.08.2006 15:26
von AND51
Erbarmt sich denn nochmal neiner und versucht mir das näher zu bringen?
Verfasst: 07.08.2006 18:18
von ts-soft
shift (<< >>) ist in der Hilfe ausführlich erklärt. Ausserdem kannste doch
auch PB4 nutzen, da sowas, dank Quad, nicht mehr erforderlich.
PS: Mals Dir auf nen Zettel, bis Du die Bits verstehst

Verfasst: 07.08.2006 21:15
von AND51
OK.
btw: ich meinte nicht, dass mir jemand das mit den Bits erklärt, sondern, wie ich nun die gewünschten Informationen aus GetDiskFreeSpace_() quetschen kann.
Ausgehend von meinem Code:
Ist denn nun a\long1 oder b\long2 oder c\long1 etc. das, was ich auslesen muss, etc.
Da ich ja 3.94 verwende wäre es mir auch egal; dann müssen halt FLoats herhalten um diese großen Zahlen aufnehmen zu können.
Verfasst: 07.08.2006 21:40
von ts-soft
AND51 hat geschrieben:
Da ich ja 3.94 verwende wäre es mir auch egal; dann müssen halt FLoats herhalten um diese großen Zahlen aufnehmen zu können.
Du meinst also, Floats können das
Ich glaube dieses Schuljahr muß wiederholt werden

Verfasst: 08.08.2006 00:02
von AND51
@ Schuljahr: Ja, dieses Schuljahr (Jgst. 11) wird wiederholt - trotz meiner 1 in Informatik (kein Scherz)...
@ Floats:
PB Hilfe hat geschrieben:Byte .b 1 Byte im Speicher -128 bis +127
Word .w 2 Byte im Speicher -32768 bis +32767
Long .l 4 Byte im Speicher -2147483648 bis +2147483647
Float .f 4 Byte im Speicher unlimitiert (siehe unten)
"Bereich unlimitiert" sagt mir, dass Floats auch Zahlen aufnehmen können, die Long nicht mehr schafft.
In diesem Zusammenhang noch eine andere kleine Frage, die von meinem obigen Problem aber nicht ablenken soll:
FileSize() - Gibt das auch die größe einer Datei (in Bytes zurück), selbst wenn das Eregbnis nicht in eine Longvariable passt; soll heißen: auch von Dateien, die größer als 2 GB sind?
Verfasst: 08.08.2006 00:09
von Kaeru Gaman
@AND
benutz bitte mal die forensuche, betreff genauigkeit etc. bei floats.
ich hab keinen bock, denselben sermon zum dreihundertfünfzigsten mal zu tippen.
Verfasst: 08.08.2006 00:25
von ts-soft
>> auch von Dateien, die größer als 2 GB sind?
Nein, in Deiner PB Version nicht. Nur in PB4 ist dies ein Quad
