VB 2010: Problem mit GetDiskFreeSpaceEx

PhoenixDH

Erfahrenes Mitglied
Hallo zusammen,

ich habe eine Windows Form mit genau diesem Code hier:
http://support.microsoft.com/kb/225144/de

Das Problem hierbei ist, das VB 2010 mit folgender Passage meckert:
Code:
Private Type LARGE_INTEGER
    lowpart As Long
    highpart As Long
End Type

Deswegen habe ich den wie folgt abgeändert:
Code:
    Private Structure LARGE_INTEGER
        Dim lowpart As Long
        Dim highpart As Long
    End Structure

Zu dem Problem:
Der Code ist zwar fehlerfrei, aber alle Ergebnisse sind 0 für Laufwerk C:\

Woran könnte das liegen, kennt das wer?

Danke.
 
Hi.

Wenn du bestimmte Windows API Funktionen von .NET aus aufrufen willst, solltest du erstmal bei pinvoke.net suchen.

http://pinvoke.net/default.aspx/coredll/GetDiskFreeSpaceEx.html

Einfach Code kopieren und fertig. Der Code den du gefunden hast war für Visual Basic 6. In .NET gibt es einen eingebauten 64 Bit Integertyp (ulong), da brauchst du LARGE_INTEGER nicht zu definieren.

Übrigens kannst du auch über die .NET DriveInfo Klasse die Größe und den freien Speicher ermitteln: http://msdn.microsoft.com/en-us/library/system.io.driveinfo.aspx

Gruß
 
Zuletzt bearbeitet:
Mir stellt sich die Frage, wieso du unter .NET so eine alte Funktion verwenden willst. VB.NET bietet mit der DriveInfo-Klasse alles, was du benötigst:
Visual Basic:
        For Each objDrive As System.IO.DriveInfo In System.IO.DriveInfo.GetDrives()
            'Wäre jetzt die Abfrage für C, kannst du natürlich an eigene Bedürfnisse anpassen
            If objDrive.Name.Substring(0, 1).ToLower = "c" Then MsgBox(objDrive.AvailableFreeSpace)
        Next


Der Doc!
 
Mir stellt sich die Frage, wieso du unter .NET so eine alte Funktion verwenden willst. VB.NET bietet mit der DriveInfo-Klasse alles, was du benötigst:
Soweit mir bekannt ist, unterstützt .NETs DriveInfo Klasse keine eingebundenen Freigaben, die Windows API Funktion aber schon. Das wäre zumindest ein Grund die Funktion zu verwenden.
Visual Basic:
        For Each objDrive As System.IO.DriveInfo In System.IO.DriveInfo.GetDrives()
            'Wäre jetzt die Abfrage für C, kannst du natürlich an eigene Bedürfnisse anpassen
            If objDrive.Name.Substring(0, 1).ToLower = "c" Then MsgBox(objDrive.AvailableFreeSpace)
        Next
Geht natürlich auch einfacher wenn man nur von einem bestimmten Laufwerk die Information haben will:
Visual Basic:
MsgBox(new DriveInfo("c").AvailableFreeSpace)
Gruß
 
Dank euch schonmal für die vielen Antworten.
Das ganze sollte eigentlich dann mal geändert werden um den Speicherplatz von Servern auszulesen, wie z.B.

\\1.2.3.4\C$

Geht das mit dem was ihr erwähnt habt auch?

Was den ersten Code von pinvoke angeht, bin ich zu blöd?

Code:
    Declare Function GetDiskFreeSpaceEx Lib "CoreDll.dll" ( _
        ByVal lpDirectoryName As String, _
        ByRef lpFreeBytesAvailable As UInt64, _
        ByRef lpTotalNumberOfBytes As UInt64, _
        ByRef lpTotalNumberOfFreeBytes As UInt64) As Integer

    Private Sub test()
        Dim lResult As Integer
        Dim liAvailable As UInt64
        Dim liTotal As UInt64
        Dim liFree As UInt64

        lResult = GetDiskFreeSpaceEx("C:\", liAvailable, liTotal, liFree)

        MsgBox(lResult)
    End Sub

Muss dazusagen, bin noch neu auf dem Gebiet.
 
Dank euch schonmal für die vielen Antworten.
Das ganze sollte eigentlich dann mal geändert werden um den Speicherplatz von Servern auszulesen, wie z.B.

\\1.2.3.4\C$

Geht das mit dem was ihr erwähnt habt auch?
Genau das geht eben nicht.
Was den ersten Code von pinvoke angeht, bin ich zu blöd?

Code:
    Declare Function GetDiskFreeSpaceEx Lib "CoreDll.dll" ( _
        ByVal lpDirectoryName As String, _
        ByRef lpFreeBytesAvailable As UInt64, _
        ByRef lpTotalNumberOfBytes As UInt64, _
        ByRef lpTotalNumberOfFreeBytes As UInt64) As Integer

    Private Sub test()
        Dim lResult As Integer
        Dim liAvailable As UInt64
        Dim liTotal As UInt64
        Dim liFree As UInt64

        lResult = GetDiskFreeSpaceEx("C:\", liAvailable, liTotal, liFree)

        MsgBox(lResult)
    End Sub

Muss dazusagen, bin noch neu auf dem Gebiet.
Der Rückgabewert der Funktion ist lediglich ein BOOL (1 oder 0).
Visual Basic:
if GetDiskFreeSpaceEx("C:\", liAvailable, liTotal, liFree) <> 0 Then
  MsgBox(liAvailable)
end if
\edit: Das Beispiel auf pinvoke hast du gesehen?
\edit2: Ich würde die Funktion gleich mit Boolean als Rückgabetyp deklarieren, so wie die C# und die erste VB.NET Signatur zeigen.

Gruß
 
Zuletzt bearbeitet:
Wenn das nicht geht remote den Speicher auszulesen kann ich eh an der Stelle abbrechen.
Ja, das Bsp. hab ich gesehen, das läuft aber auch net bei meinem VB Code.

Gibt es irgendetwas womit das gehen würde?
 
Wenn das nicht geht remote den Speicher auszulesen kann ich eh an der Stelle abbrechen.
Hast du gelesen was ich geschrieben habe? Ich sagte es geht nicht mit der DriveInfo Klasse. Mit GetDiskFreeSpaceEx geht das.
Ja, das Bsp. hab ich gesehen, das läuft aber auch net bei meinem VB Code.
Es ist ja auch C#. Das mußt du übersetzen, z.B. hier http://www.developerfusion.com/tools/convert/csharp-to-vb/

Gruß
 
Dann habe ich das verdreht.
Ich habe das mal konvertiert, dann bekomme ich doch das hier, incl. dem Boolean:
Code:
    Declare Function GetDiskFreeSpaceEx Lib "CoreDll.dll" ( _
        ByVal lpDirectoryName As String, _
        ByRef lpFreeBytesAvailable As UInt64, _
        ByRef lpTotalNumberOfBytes As UInt64, _
        ByRef lpTotalNumberOfFreeBytes As UInt64) As Boolean

    Private Sub test()
        Dim FreeBytesAvailable As ULong
        Dim TotalNumberOfBytes As ULong
        Dim TotalNumberOfFreeBytes As ULong

        Dim success As Boolean = GetDiskFreeSpaceEx("C:\", FreeBytesAvailable, TotalNumberOfBytes, TotalNumberOfFreeBytes)
        If Not success Then
            Throw New System.ComponentModel.Win32Exception()
        End If

        MsgBox(FreeBytesAvailable)
        MsgBox(TotalNumberOfBytes)
        MsgBox(TotalNumberOfFreeBytes)
    End Sub

Das läuft nicht.
Danke!
 

Neue Beiträge

Zurück