VB6: freier Speicherplatz auf einem Laufwerk

Hallo Expert(inn)en!

Wer weiss, was man machen muss, um in einem VB6-Programm den freien Speicherplatz eines Laufwerks ermitteln zu können?
Ich hab zwar die Funktion GetDiskFreeSpace in der Kernel32.dll gefunden, aber diese liefert mir immer nur 0 zurück.
Mache ich vielleicht beim Aufruf der Funktion etwas falsch?
Was muss ich übergeben? Nur den Laufwerksbuchstaben (z. B. „C“) oder „C:“ oder „C:“? Ich habe alle 3 Varianten ausprobiert, immer mit dem gleichen Ergenbis (eben 0). An alle anderen Parameter habe ich 0 übergeben (jeweils in Variablen).

Ich bitte euch darum, einem armen, kleinen Österreicher zu helfen … :wink:
Roland

Hi,

Ich bitte euch darum, einem armen, kleinen Österreicher zu
helfen … :wink:

Das tun wir gern:
aus dem API-Guide:

'In general section
Private Declare Function GetDiskFreeSpace Lib "kernel32" Alias "GetDiskFreeSpaceA" (ByVal lpRootPathName As String, lpSectorsPerCluster As Long, lpBytesPerSector As Long, lpNumberOfFreeClusters As Long, lpTtoalNumberOfClusters As Long) As Long

Private Sub Form\_Load()
 'KPD-Team 1998
 'URL: http://www.allapi.net/
 'E-Mail: [email protected]

 Dim Sectors as Long,Bytes as Long,FreeC as Long, TotalC as Long,Total as Long,Freeb as Long
 'Retrieve information about the C:\
 GetDiskFreeSpace "C:\", Sectors, Bytes, Freec, Totalc
 'Set graphic mode to persistent
 Me.AutoRedraw = True
 'Print the information to the form
 Me.Print " Path: C:\"
 Me.Print " Sectors per Cluster:" + Str$(Sector)
 Me.Print " Bytes per sector:" + Str$(Bytes)
 Me.Print " Number Of Free Clusters:" + Str$(Freec)
 Me.Print " Total Number Of Clusters:" + Str$(Totalc)
 Total = rTotalc& \* rSector& \* rBytes&
 Me.Print " Total number of bytes in path:" + Str$(Total)
 Freeb = rFreec& \* rSector& \* rBytes&
 Me.Print " Free bytes:" + Str$(Freeb)
End sub

Gruß

J.

vielen Dank!
Danke, so funktioniert es jetzt bei mir!
Fast hätte ich es ja selber gehabt, aber eben nur fast … knapp daneben ist auch vorbei, sagt man … :wink:

Roland

Hi,

Ich bitte euch darum, einem armen, kleinen Österreicher zu
helfen … :wink:

Das tun wir gern:

Zusatz-Frage / -Problem
Wenn die Multiplikation von Sectors per Cluster, Bytes per Cluster und Number of free Clusters einen Wert > 2.147.483.647 ergibt (also mehr als 2 GB auf dem Laufwerk frei sind), dann stürzt das Ding mit einem Overflow-Error ab. Ich hab dann die Variable für das Ergebnis der Multiplikation als single (statt long) definiert, das müsste doch für grössere Zahlen (bis 10 hoch 38 oder so) reichen, oder? Der Overflow kommt aber trotzdem! Oder liegt es an einer anderen Kleinigkeit, an der ich wieder einmal haarscharf vorbeischaue?

der wahrscheinlich den Wald vor lauter Bäumen (oder die Festplatte vor lauter Bytes oder so *g*) nicht sehende
Roland

Private Declare Function GetDiskFreeSpace Lib „kernel32“ Alias
„GetDiskFreeSpaceA“ (ByVal lpRootPathName As String,
lpSectorsPerCluster As Long, lpBytesPerSector As Long,
lpNumberOfFreeClusters As Long, lpTtoalNumberOfClusters As
Long) As Long

Private Sub Form_Load()
'KPD-Team 1998
'URL: http://www.allapi.net/
'E-Mail: [email protected]

Dim Sectors as Long,Bytes as Long,FreeC as Long, TotalC as
Long,Total as Long,Freeb as Long
'Retrieve information about the C:\
GetDiskFreeSpace „C:“, Sectors, Bytes, Freec, Totalc
'Set graphic mode to persistent
Me.AutoRedraw = True
'Print the information to the form
Me.Print " Path: C:"
Me.Print " Sectors per Cluster:" + Str$(Sector)
Me.Print " Bytes per sector:" + Str$(Bytes)
Me.Print " Number Of Free Clusters:" + Str$(Freec)
Me.Print " Total Number Of Clusters:" + Str$(Totalc)
Total = rTotalc& * rSector& * rBytes&
Me.Print " Total number of bytes in path:" + Str$(Total)
Freeb = rFreec& * rSector& * rBytes&
Me.Print " Free bytes:" + Str$(Freeb)
End sub

ich nehme an die Multiplikanden sind Long-Variablen,
z.b.

Dim bla As Single
Dim a As Long, b As Long
 a = 200000000#
 b = 20000000#
 bla = a \* b

gibt einen Overflow

Dim bla As Single
Dim a As Long, b As Long
 a = 200000000#
 b = 20000000#
 bla = CSng(a) \* CSng(b)

wandelt a und b in Single-Werte um und funkt :wink:
lg

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]