IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Obtenir l'espace libre d'un disque dur


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Points : 193
    Points
    193
    Par défaut Obtenir l'espace libre d'un disque dur
    Bonjour,

    Je travail en ce moment sur une application qui tourne sous Windows. Je programme en C++, j'utilise Qt et les API Windows. Mon soucis est le suivant :

    Je suis actuellement capable d'obtenir l'espace total/libre/occupé, de chacune des partitions existantes sur ma machine Le problème, c'est que je n'arrive pas à déterminer à quel disque dur appartiennent ces partitions. Et de ce fait, je n'arrive pas à déterminer non plus quel est l'espace disponible de mes disques dur.

    Comment puis-je obtenir l'espace libre de chaque partitions appartenant à un seul et même disque dur ?

    Pour informations, j'utilise dans mon programme les fonctions suivantes :
    IOCTL_DISK_GET_DRIVE_LAYOUT, PARTITIONS_INFORMATION et autre
    GetDiskFreeSpace

    Cordialement
    PKO

  2. #2
    Membre actif Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Points : 237
    Points
    237
    Par défaut
    Je sais pas si tu as vu mais il vaut mieux utiliser GetDiskFreeSpaceEx
    The GetDiskFreeSpace function cannot report volume sizes that are greater than 2 gigabytes (GB). To ensure that your application works with large capacity hard drives, use the GetDiskFreeSpaceEx function.
    Edit: tu as un exemple d'utilisation ici.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Points : 193
    Points
    193
    Par défaut
    Twindruff > Bonjour. J'utilise effectivement cette fonction. Si elle est capable de me fournir diverses informations utiles concernant l'espace des mes partitions, je n'ai pas trouvé le moyen de l'utiliser pour lire l'espace disponible de mes disques durs. Ni pour déterminer si la partition analysée appartient à mon hdd1 ou hdd2 (dans le cas simple ou je ne posséderais que 2 hdd).

    MSDN indique pourtant : "If this parameter is NULL, the function uses the root of the current disk.", en parlant du premier argument. J'en déduis que je pourrais tout au mieux, obtenir les informations relatives à l'espace total/libre/occupé du hdd courant, mais pour les autres hdd, comment faire ?

    Cordialement,
    PKO

  4. #4
    Membre actif Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Points : 237
    Points
    237
    Par défaut
    Citation Envoyé par Twindruff Voir le message
    tu as un exemple d'utilisation ici.
    Tu as regardé le sample ?
    Ce code fonctionne bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
       #include <windows.h>
       #include <stdio.h>
     
     
       void main (int argc, char **argv)
       {
          BOOL  fResult;
     
          char  *pszDrive  = NULL,
                 szDrive[4];
     
          unsigned __int64 i64FreeBytesToCaller,
                           i64TotalBytes,
                           i64FreeBytes;
     
          /*
             Command line parsing.
     
             If the drive is a drive letter and not a UNC path, append a 
             trailing backslash to the drive letter and colon.  This is 
             required on Windows 95 and 98.
          */ 
          if (argc != 2)
          {
             printf ("usage:  %s <drive|UNC path>\n", argv[0]);
             printf ("\texample:  %s C:\\\n", argv[0]);
             return;
          }
     
          pszDrive = argv[1];
     
          if (pszDrive[1] == ':')
          {
             szDrive[0] = pszDrive[0];
             szDrive[1] = ':';
             szDrive[2] = '\\';
             szDrive[3] = '\0';
     
             pszDrive = szDrive;
          }
     
     
         fResult = GetDiskFreeSpaceEx (pszDrive,
                                 (PULARGE_INTEGER)&i64FreeBytesToCaller,
                                 (PULARGE_INTEGER)&i64TotalBytes,
                                 (PULARGE_INTEGER)&i64FreeBytes);
         if (fResult)
         {
            printf ("\n\nGetDiskFreeSpaceEx reports\n\n");
            printf ("Available space to caller = %I64u MB\n",
                    i64FreeBytesToCaller / (1024*1024));
            printf ("Total space               = %I64u MB\n",
                    i64TotalBytes / (1024*1024));
            printf ("Free space on drive       = %I64u MB\n",
                    i64FreeBytes / (1024*1024));
         }
     
          if (!fResult)
             printf ("error: %lu:  could not get free space for \"%s\"\n",
                     GetLastError(), argv[1]);
       }

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Points : 193
    Points
    193
    Par défaut
    Twindruff > Bonjour. Oui, j'ai regardé l'exemple. Mais comme je l'ai dit, il ne permet que d'obtenir l'espace d'une partition (C:\ D:\). Et ce que je souhaite obtenir, c'est l'espace de mon disque dur physique.

    Je pourrais par exemple additionner les espaces des mes partitions à l'aide de la fonction "GetDiskFreeSpaceEx ". Mais cette fonction ne me permet pas de savoir si la partition C:\ appartient a mon disque dur physique 1, ou 2.
    Par exemple :

    [DISQUE DUR 1]

    - C:\ (20Go)
    - D:\ (130Go)

    [DISQUE DUR 2]
    - E:\ (50Go)
    - F:\ (130Go)
    La fonction que tu proposes me permettra de connaitre la taille de C D E et F. Mais comment savoir la taille de mon DISQUE DUR 1 et de mon DISQUE DUR 2 sachant que rien ne m'indique que C et D appartiennent a DISQUE DUR 1 et que E et F appartiennent à DISQUE DUR 2.

    Donc actuellement, je peut obtenir l'espace de mes partitions (C:\ D:\ ...) mais pas de mes disques dur (DISQUE DUR 1 et DISQUE DUR 2).

    Cordialement,
    PKO

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Points : 193
    Points
    193
    Par défaut
    Existe t'il un moyen pour savoir a quelle HDD appartient une partition ?

    Cordialement,
    PKO

  7. #7
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Regarde vers DeviceIoControl() et son parametre DRIVE_LAYOUT_INFORMATION. Je pense que cela répondera à tes besoins.

    Liens vers la doc msdn

    Essaye aussi cette fonction GetVolumeNameForVolumeMountPoint je pense qu'elle repondra a quel disque physique appartient le C: , D: etc.

    doc msdn

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Points : 193
    Points
    193
    Par défaut
    Bonjour,

    J'ai bossé sur le code source une bonne partie de la nuit, jusqu'à ce matin.
    J'ai réussi a comprendre la partie qui m'intéresse en passant par le mode debug :
    - On avance pas à pas avec une doc MSDN sous les yeux
    - On commente au fur et a mesure
    - On comprend au fur et a mesure

    Au final, avec méthode et patience, c'est pas si compliqué, mais je dois tout de même lever mon chapeau à la personne qui a codé ceci. J'imagine à peine le nombre d'heures nécessaire à l'analyse ...

    En tout cas merci.
    Je reposerais sans doute une petite analyse du code.

    Cordialement,
    PKO

  9. #9
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    En général utiliser VC++ en mode debug et faire du pas à pas c'est vraiment très utile.

    S'il y a vraiment du code que tu ne comprends pas n'hésite pas poster peut être qu'on pourra t'aider.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup pour cette discussion.
    Je suis un débutant avancé qui bosse sur Qt.
    Cela fait trois jours que je cherche à savoir comment trouver le FREESPACE et le TOTAL DISK SPACE d'un lecteur.
    J'ai vu plusieurs exemples qui datent et qui ne fonctionnent pas directement.
    Je n'ai pas trouvé non plus de tutos concernant ce sujet.

    Je sais qu'avec Qt 5, il existe le module QtSystems permettant d'avoir des options sur les disques mais, je suis toujours bloqué par la non-information : aucun tuto clair pour expliquer comment utiliser/installer/faire fonctionner.

    Mais grâce à ce post, j'ai au moins obtenu un code qui fonctionne à peu près correctement comme je le souhaite.

    Merci à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Obtenir l'espace libre d'un systeme de fichier
    Par sbrillard dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 13/11/2008, 10h46
  2. [Free Pascal] Connaître l'espace libre d'un disque (Windows/Linux)
    Par Merlin09 dans le forum Free Pascal
    Réponses: 2
    Dernier message: 03/02/2008, 22h33
  3. Espace Libre sur les disques
    Par SILO dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 28/07/2006, 11h23
  4. Réponses: 1
    Dernier message: 28/02/2006, 23h43
  5. Réponses: 2
    Dernier message: 15/06/2005, 18h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo