2010-02-17 3 views
3

Je sais que vous pouvez utiliser une combinaison de GetLogicalDrives() et GetDiskFreeSpaceEx() pour obtenir la liste des lecteurs et leurs tailles. J'ai utilisé GetDiskFreeSpaceEx() sans problème mais quand j'essaye d'utiliser GetLogicalDrives() j'ai rencontré un problème: je ne veux pas avoir à vérifier chaque lettre possible pour voir si elle existe ou non avant de la passer à GetDiskFreeSpaceEx().Obtenez la liste des lecteurs disponibles et leurs tailles

Existe-t-il un moyen plus simple d'obtenir la liste des disques (disque) sur le système et quelles sont leurs tailles? J'utilise C, sur Windows. Je veux faire quelque chose de clair, je sait il pourrait être plus facile d'utiliser C# et WMI, je n'ai aucun intérêt sur ce s'il vous plaît ne postez pas comme une solution possible. Si vous voulez montrer comment cela se fait en C et WMI, allez-y. NO C++ ou C# merci! (comme quelqu'un l'a fait dans my previous question)

+0

+1, bonne q, + ajouté tag winapi aux réponses directes, espérons correctement. –

+0

"Je ne veux pas avoir à vérifier chaque lettre possible pour voir si elle existe ou pas" ... ok vous ne voulez pas, mais devez-vous vérifier si le lecteur existe ou non? Si oui, veuillez expliquer pourquoi. –

+0

parce que sur certains systèmes, vous pouvez rester coincé sur une boucle sur les lecteurs distants – Jessica

Répondre

5

GetLogicalDrives() est l'API fournie par le système pour cela. Un simple() boucle se traduira par son résultat en lettres de lecteur, comme ceci:

DWORD d = GetLogicalDrives(); 
int i; 
TCHAR Drive[] = _T("A:\\"); 
for(i=0;i<26;i++) 
{ 
    if(d & (1<<i)) 
    { 
     Drive[0] = _T('A')+i; 
     GetDiskFreeSpaceEx(Drive, .....); 
    } 
} 

Et si vous n'êtes pas satisfait du niveau de service que Stack Overflow offre, vous pouvez demander votre argent.

+0

Ce n'est pas que je ne suis pas satisfait. c'est que les gens ne font pas attention à la question et les étiquettes. Ce n'est pas la première fois que ça arrive. Si je demandais quelque chose de SPÉCIFIQUEMENT en C pourquoi répondriez-vous en VB? Merci pour la réponse – Jessica

+2

Je pense que c'est < 26 => http://stackoverflow.com/questions/1944877/maximum-number-of-drives-in-windows –

+0

Droit. Fixe ... –

7

Vous pouvez utiliser GetLogicalDriveStrings - cela retourne un tampon contenant toutes les lettres de lecteur valides sur le système.

MISE À JOUR:

est l'exemple de programme Ici j'ai écrit que les lecteurs en utilisant énumère GetLogicalDriveStrings et émet des informations de base à leur sujet.

#include <windows.h> 
#include <malloc.h> 
#include <stdio.h> 

int __cdecl main() 
{ 
    DWORD cchBuffer; 
    WCHAR* driveStrings; 
    UINT driveType; 
    PWSTR driveTypeString; 
    ULARGE_INTEGER freeSpace; 

    // Find out how big a buffer we need 
    cchBuffer = GetLogicalDriveStrings(0, NULL); 

    driveStrings = (WCHAR*)malloc((cchBuffer + 1) * sizeof(TCHAR)); 
    if (driveStrings == NULL) 
    { 
     return -1; 
    } 

    // Fetch all drive strings  
    GetLogicalDriveStrings(cchBuffer, driveStrings); 

    // Loop until we find the final '\0' 
    // driveStrings is a double null terminated list of null terminated strings) 
    while (*driveStrings) 
    { 
     // Dump drive information 
     driveType = GetDriveType(driveStrings); 
     GetDiskFreeSpaceEx(driveStrings, &freeSpace, NULL, NULL); 

     switch (driveType) 
     { 
     case DRIVE_FIXED: 
      driveTypeString = L"Hard disk"; 
      break; 

     case DRIVE_CDROM: 
      driveTypeString = L"CD/DVD"; 
      break; 

     case DRIVE_REMOVABLE: 
      driveTypeString = L"Removable"; 
      break; 

     case DRIVE_REMOTE: 
      driveTypeString = L"Network"; 
      break; 

     default: 
      driveTypeString = L"Unknown"; 
      break; 
     } 

     printf("%S - %S - %I64u GB free\n", driveStrings, driveTypeString, 
        freeSpace.QuadPart/1024/1024/1024); 

     // Move to next drive string 
     // +1 is to move past the null at the end of the string. 
     driveStrings += lstrlen(driveStrings) + 1; 
    } 

    free(driveStrings); 

    return 0; 

} 

Sur ma machine cette sortie:

C:\ - Hard disk - 181 GB free 
D:\ - CD/DVD - 0 GB free 
E:\ - Hard disk - 806 GB free 
+0

merci, mais je ne peux pas le faire fonctionner ... il se bloque lorsque j'ai essayé d'envoyer chaque chaîne à GetDiskFreeSpaceEx. Y a-t-il une chance que vous puissiez poster un extrait de code? – Jessica

+0

@Jessica - Mise à jour avec du code. – Michael

+0

gratuitement manquant ... –

1

Il s'agit du code de Michael rejected en tant que modification. Il segmente les défauts sur la free() moins une variable factice « singleDriveString » est insérée ainsi:

#include <windows.h> 
#include <malloc.h> 
#include <stdio.h> 

int __cdecl main() 
{ 
DWORD cchBuffer; 
WCHAR* driveStrings; 
UINT driveType; 
PWSTR driveTypeString; 
ULARGE_INTEGER freeSpace; 

// Find out how big a buffer we need 
cchBuffer = GetLogicalDriveStrings(0, NULL); 

driveStrings = (WCHAR*)malloc((cchBuffer + 1) * sizeof(TCHAR)); 
if (driveStrings == NULL) 
{ 
    return -1; 
} 

// Fetch all drive strings  
GetLogicalDriveStrings(cchBuffer, driveStrings); 

// Loop until we find the final '\0' 
// driveStrings is a double null terminated list of null terminated strings) 
wchar_t * singleDriveString = driveStrings; 
while (*singleDriveString) 
{ 
    // Dump drive information 
    driveType = GetDriveType(singleDriveString); 
    GetDiskFreeSpaceEx(singleDriveString, &freeSpace, NULL, NULL); 

    switch (driveType) 
    { 
    case DRIVE_FIXED: 
     driveTypeString = L"Hard disk"; 
     break; 

    case DRIVE_CDROM: 
     driveTypeString = L"CD/DVD"; 
     break; 

    case DRIVE_REMOVABLE: 
     driveTypeString = L"Removable"; 
     break; 

    case DRIVE_REMOTE: 
     driveTypeString = L"Network"; 
     break; 

    default: 
     driveTypeString = L"Unknown"; 
     break; 
    } 

    printf("%S - %S - %I64u GB free\n", singleDriveString, driveTypeString, 
       freeSpace.QuadPart/1024/1024/1024); 

    // Move to next drive string 
    // +1 is to move past the null at the end of the string. 
    singleDriveString += lstrlen(singleDriveString) + 1; 
} 

free(driveStrings); 

return 0; 

} 
Questions connexes