Aide sur l'API GetDiskFreeSpace ou GetDiskFreeSpaceEx [Résolu]

sturtrid 133 Messages postés dimanche 20 mai 2007Date d'inscription 13 juillet 2012 Dernière intervention - 25 juin 2008 à 12:10 - Dernière réponse : cs_bidouille007 263 Messages postés jeudi 11 septembre 2008Date d'inscription 22 décembre 2012 Dernière intervention
- 7 sept. 2009 à 03:05
Bonjour à tous les confrères...



Je viens faire appel à votre perspicacité car je rencontre un problème avec l'utilisation de l'API
"GetDiskFreeSpace" ou de sa version "GetDiskFreeSpaceEx"...
Pour info, mon but est d'obtenir la taille des clusters d'un DD car mon programme en a besoin.

Voici les API en question :
'API GetDiskFreeSpace
    Private Declare Function GetDiskFreeSpace _
    Lib "kernel32"Alias"GetDiskFreeSpaceA"_
    (ByVal lpRootPathName As String, _
    ByRef lpSectorsPerCluster As Long, _
    ByRef lpBytesPerSector As Long, _
    ByRef lpNumberOfFreeClusters As Long, _
    ByRef lpTotalNumberOfClusters As Long) As Boolean
'==============================================================
'API GetDiskFreeSpaceEx
    Private Declare Function GetDiskFreeSpaceEx _
    Lib"kernel32"Alias"GetDiskFreeSpaceExA" _
    (ByVal lpDirectoryName As String, _
    ByVal lpFreeBytesAvailableToCaller As Long, _
    ByVal lpTotalNumberOfBytes As Long, _
    ByVal lpTotalNumberOfFreeBytes As Long) As Long
'==============================================================

Au départ, j'ai tenté d'utiliser l'API GetDiskFreeSpace mais comme cela ne marchait pas
(elle me retourne0 à chaque fois => signe d'echec de l'API), donc j'ai testé son autre version
GetDiskFreeSpaceEx.... Mais le resultat est le même !

Les fonctions d'appel :
'SUB pour GetDiskFreeSpace
    Private Sub API_GetDiskFreeSpace()

        Dim SecteurByCluster As Long
        Dim OctetBySecteur As As Long
        Dim ClusterLibre As As Long
        Dim ClusterDisque As As Long

        GetDiskFreeSpace("C:", SecteurByCluster, OctetBySecteur, _
        ClusterLibre, ClusterDisque)

        MessageBox.Show(Chemin)
        MessageBox.Show("Nombres de secteur par cluster : " & SecteurByCluster)
        MessageBox.Show("Nombre de octets par secteur : " & OctetBySecteur)
        MessageBox.Show("Nombre de cluster libre : " & ClusterLibre)
        MessageBox.Show("Nombres de Cluster sur le disque : "& ClusterDisque)

    End Sub
'==============================================================
'SUB pour GetDiskFreeSpaceEx
    Private SubAPI_GetDiskFreeSpaceEx()

        Dim RES As Long
        Dim TotalBytes As Long
        Dim FreeBytes As Long
        Dim BytesAvailableToCaller As Long

        RES = GetDiskFreeSpaceEx _
        ("C:", BytesAvailableToCaller, TotalBytes, FreeBytes)

        If (Status <> 0) Then
            MessageBox.Show("TotalBytes : " &Total Bytes)
            MessageBox.Show("FreeBytes : " &FreeBytes)
            MessageBox.Show("BytesAvailableToCaller : " &BytesAvailableToCaller)
       End If

    End Sub
'==============================================================

Ensuite j'utilise comme suit dans un évènement Click par exemple (pour le test) :

API_GetDiskFreeSpace()
API_GetDiskFreeSpaceEx()

Vala, avec ça les fonctions me retournent 0 pour toutes les valeurs dans mes MsgBox...

Si quelqu'un voit le problème cela me serait d'une grande aide. C'est peut être une erreur de
code de ma part mais je ne pense pas puisque le code "tourne". J'ai essayé avec plusieurs
types numériques pour les paramètres, testé sur plusieurs DD mais rien n'y fait !

Merci d'avance pour votre aide...

PS: si la valeur est accessible via le registre ou un autre moyen, je suis preneur mais je préfèrerais par API...
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
sturtrid 133 Messages postés dimanche 20 mai 2007Date d'inscription 13 juillet 2012 Dernière intervention - 25 juin 2008 à 15:56
3
Merci
Ahhhhh ! Enfin...



Bon bein ça finit par marcher, mais "GetDiskFreeSpace" est la seule API qui permet de récupérer la taille des clusters. Suffit de faire (lpSectorsPerCluster * lpBytesPerSector) après son appel (on l'aurait pas deviner hein ?!)

J'ai pas tout compris sur le pourquoi du comment de se problème, j'ai bidouillé dans tous les sens et quand il m'a semblé être revenu au code de départ.... TADA! Si quelqu'un veut que je remette le code final, laissez un p'tit message...

En tout cas je vous remercie pour votre coup de pouce !
A la prochaine et bonne fin de journée... ++

Merci sturtrid 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de sturtrid
sturtrid 133 Messages postés dimanche 20 mai 2007Date d'inscription 13 juillet 2012 Dernière intervention - 25 juin 2008 à 12:26
0
Merci
Euh... Désolé, quelques petites erreurs se sont glissées dans mon post...

Les voici en soulignées :

'= ==================== API GetDiskFreeSpace ========================
    Private Declare Function GetDiskFreeSpace _
    Lib "kernel32"Alias"GetDiskFreeSpaceA"_
    (ByVal lpRootPathName As String, _
    ByRef lpSectorsPerCluster As Long, _
    ByRef lpBytesPerSector As Long, _
    ByRef lpNumberOfFreeClusters As Long, _
    ByRef lpTotalNumberOfClusters As Long) As Long
' == ============================================================
'SUB pour GetDiskFreeSpaceEx
    Private SubAPI_GetDiskFreeSpaceEx()

        Dim RES As Long
        Dim TotalBytes As Long
        Dim FreeBytes As Long
        Dim BytesAvailableToCaller As Long

        RES = GetDiskFreeSpaceEx _
        ("C:", BytesAvailableToCaller, TotalBytes, FreeBytes)

        If ( RES <> 0) Then
            MessageBox.Show("TotalBytes : " & Total Bytes)
            MessageBox.Show("FreeBytes : " & FreeBytes)
            MessageBox.Show("BytesAvailableToCaller : " & BytesAvailableToCaller)
       End If

    End Sub
' ==============================================================

En passant, mes MessageBox me retournent toujours 0, mais lorsque je fais un pas à pas détaillé
et que je regarde la valeur des variables locales, "RES" prend une valeur non nulle assez importante
(55834574849), mais j'ai aucune idée de sa signification !
Commenter la réponse de sturtrid
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 25 juin 2008 à 12:26
0
Merci
GetDiskFreeSpace() est une antiquité encore présente pour compatibilité, A ABANDONNER ABSOLUMENT.

GetDiskFreeSpaceEx() prend 3 adresses (donc ByRef !!!) de buffers 64 bits (!!!) pour les retours. Vérifie si tes 'Long' sont bien de 64 bits.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 25 juin 2008 à 12:29
0
Merci
Bonjour,
Dit mille et une fois,

En VB.NBet, le typage est en Integer et non en Long.
Commenter la réponse de jmfmarques
Charles Racaud 3181 Messages postés dimanche 15 février 2004Date d'inscription 9 avril 2017 Dernière intervention - 25 juin 2008 à 12:36
0
Merci
En vb.net, les Integer est en 32bits. Pour du 64, c'est bien du long.

    Private Declare Function GetDiskFreeSpaceEx _
    Lib "kernel32" Alias "GetDiskFreeSpaceExA" _
    (ByVal lpDirectoryName As String, _
    ByRef lpFreeBytesAvailableToCaller As Long, _
    ByRef lpTotalNumberOfBytes As Long, _
    ByRef lpTotalNumberOfFreeBytes As Long) As Boolean
http://msdn.microsoft.com/en-us/library/aa912270.aspx

__________
  Kenji
Commenter la réponse de Charles Racaud
Charles Racaud 3181 Messages postés dimanche 15 février 2004Date d'inscription 9 avril 2017 Dernière intervention - 25 juin 2008 à 12:36
0
Merci
Mauvais lien vers la msdn, celui ci est plus appropriée :
http://msdn.microsoft.com/en-us/library/aa364937(VS.85).aspx

__________
  Kenji
Commenter la réponse de Charles Racaud
sturtrid 133 Messages postés dimanche 20 mai 2007Date d'inscription 13 juillet 2012 Dernière intervention - 25 juin 2008 à 12:55
0
Merci
> BruNews :

Vi désolé, j'ai passé mes params en ByRef mais cela ne change rien...
Sinon pour les Long de 64 bits, je ne suis pas sure de te suivre... Les Long sont par définition des entiers de 64 bits, non? De toute façon, j'ai aussi testé en ULong ou en Integer (*jmfmarques) mais sans impact sur résultat !
Commenter la réponse de sturtrid
sturtrid 133 Messages postés dimanche 20 mai 2007Date d'inscription 13 juillet 2012 Dernière intervention - 25 juin 2008 à 13:02
0
Merci
Bon, mon but étant avant tout de récupérer la taille des clusters d'un DD, vous me confirmez bien que ces API le permettent ? (Ce serait triste que je vous embête avec un problème d'API non appropriées...)

Sinon peut être que d'autres API remplissent cette fonction, mais je n'ai trouvé que ces dernières.
Si quelqu'un en possède une autre dans son sac...
Commenter la réponse de sturtrid
sturtrid 133 Messages postés dimanche 20 mai 2007Date d'inscription 13 juillet 2012 Dernière intervention - 25 juin 2008 à 16:02
0
Merci
> BruNews : Tu me disais que l'API "GetDiskFreeSpace" était une antiquité et qu'il fallait absolument la laisser tomber au profit de "GetDiskFreeSpaceEx", seulement seule la 1ère permet d'obtenir la taille des clusters... Comme je disais dans mon dernier post, mon code "tourne" enfin, mais si tu connais une API équivalente et non obsolète pense à moi...

Merci pour tes conseils de tout à l'heure ciao !
Commenter la réponse de sturtrid
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 25 juin 2008 à 19:00
0
Merci
C'est OK s'il ne te faut que la taille de cluster mais gaffe au reste, un 32 bits ne peut bien entendu pas contenir la taille d'un volume actuel.
Commenter la réponse de BruNews
cs_bidouille007 263 Messages postés jeudi 11 septembre 2008Date d'inscription 22 décembre 2012 Dernière intervention - 7 sept. 2009 à 02:26
0
Merci
Bonjour

serait il possible de donner la solution au probleme des 0 que renvoie la fonction GetDiskFreeSpaceExA tu seras hyper sympa car je suis dans le même cas que toi

007bidouille
Commenter la réponse de cs_bidouille007
cs_bidouille007 263 Messages postés jeudi 11 septembre 2008Date d'inscription 22 décembre 2012 Dernière intervention - 7 sept. 2009 à 03:05
0
Merci
voici la solution pour VB 2008

Dim oFSO As Object
Dim oDrive As Object

oFSO = CreateObject("Scripting.FileSystemObject")
oDrive = oFSO.GetDrive("C:")

If oDrive.freespace > 1 Then
If oDrive.IsReady Then
MsgBox("Free space: " & ConvertFreeSpace(oDrive.FreeSpace))
Else
MsgBox("Free space: <drive unavailable>")
End If
End If
oDrive = Nothing
oFSO = Nothing



Private Function ConvertFreeSpace(ByVal cFreeSpace As Long) As String
Select Case cFreeSpace
Case Is < 1024
ConvertFreeSpace = cFreeSpace & " bytes"
Case Is < 1024 ^ 2
ConvertFreeSpace = FormatNumber(cFreeSpace / 1024, 2) & " KB"
Case Is < 1024 ^ 3
ConvertFreeSpace = FormatNumber(cFreeSpace / 1024 ^ 2, 2) & " MB"
Case Else
ConvertFreeSpace = FormatNumber(cFreeSpace / 1024 ^ 3, 2) & " GB"
End Select
End Function

007bidouille
Commenter la réponse de cs_bidouille007

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.