2010-09-28 6 views
1

comment obtenir des lettres de lecteurs qui sont disponibles (non utilisés) dans MFC en utilisant C++? Tout extrait de code ..comment obtenir des lettres de lecteurs qui sont disponibles (non utilisés) dans MFC?

+0

Que voulez-vous dire par noms de lecteurs? Noms de fabricants? Drive lettres? – Goz

+0

Lettres de lecteur ... –

+0

Et que voulez-vous dire en cours d'utilisation - pas d'E/S actives? Cela pourrait bien changer seconde par seconde. Qu'essayez-vous de faire? – Rup

Répondre

0

Votre probablement après GetLogicalDrives, cela vous donne un peu le masque de toutes les lettres de lecteur utilisées par le système, ce sera à vous de les convertir en lettres et de les ajouter dans la zone de liste déroulante


Pour le rendre un peu plus clair:

Valeur de retour

Si la fonction réussit, la valeur de retour est un masque représentant les unités de disques actuellement disponibles. La position de bit 0 (bit le moins significatif) est le lecteur A, le bit la position 1 est le lecteur B, la position de bit 2 est le lecteur C, et ainsi de suite.

si GetLogicalDrives() & 1 vérifie si le lecteur A est présent, GetLogicalDrives() & 4 vérifie si les lecteurs C est là

+0

comment les convertir en lettres? –

+0

@Swapnil Gupta: chaque bit représente une lettre de lecteur, le bit 0 est "A:", le bit 1 est "B:", etc, en utilisant le bit le moins significatif, il est indiqué sur la page msdn – Necrolis

2

De Here:

Cela vous donne les lecteurs qui sont en cours d'utilisation, il suffit de les éloignes du reste de l'alphabet AZ

//////////////////////////////////////////////////////////////// 
// MSDN Magazine -- April 2002 
// If this code works, it was written by Paul DiLascia. 
// If not, I don't know who wrote it. 
// Compiles with Visual C++ 6.0. Set tabsize = 3 in your editor. 
// Runs in Windows XP and probably Windows 2000 too. 
// 
#include "stdafx.h" 
#include "resource.h" 

#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 

using namespace std; // for string class 

////////////////// 
// This mini-table maps GetDriveType codes to human-readable string 
// 
struct { 
    UINT type;   // return code from GetDriveType 
    LPCSTR name;  // ascii name 
} DriveTypeFlags [] = { 
    { DRIVE_UNKNOWN,  "Unknown" }, 
    { DRIVE_NO_ROOT_DIR, "Invalid path" }, 
    { DRIVE_REMOVABLE, "Removable" }, 
    { DRIVE_FIXED,  "Fixed" }, 
    { DRIVE_REMOTE,  "Network drive" }, 
    { DRIVE_CDROM,  "CD-ROM" }, 
    { DRIVE_RAMDISK,  "RAM disk" }, 
    { 0, NULL}, 
}; 

////////////////// 
// Standard tmain for MFC ListDrives app 
// 
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) 
{ 
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { 
     cerr << _T("Fatal Error: MFC initialization failed") << endl; 
     return -1; 
    } 

    // Get logical drive strings-- a:\b:\c:\... etc. 
    // Could also use GetLogicalDrives to get in the form of a bitmap instead 
    // of character string. 
    // 
    TCHAR buf[100]; 
    DWORD len = GetLogicalDriveStrings(sizeof(buf)/sizeof(TCHAR),buf); 

    // Display information about each drive. 
    // 
    string msg = "Logical Drives:\n"; // STL string 
    for (TCHAR* s=buf; *s; s+=_tcslen(s)+1) { 
     LPCTSTR sDrivePath = s; 
     msg += sDrivePath; 
     msg += " "; 

     // GetDriveType gets one of the enum values DRIVE_UNKNOWN, etc. 
     // 
     UINT uDriveType = GetDriveType(sDrivePath); 

     // Find drive type in table. I do a table lookup here to be extra 
     // cautious, but since the uDriveType values are sequential, i could've 
     // used DriveTypeFlags[uDriveType] instead of linear lookup. In 
     // practice you would usually perform some check like 
     // 
     // if (uDriveType & DEVICE_CDROM) { 
     //  ... 
     // } 
     // 
     for (int i=0; DriveTypeFlags[i].name; i++) { 
      if (uDriveType == DriveTypeFlags[i].type) { 
       msg += DriveTypeFlags[i].name; 
       break; 
      } 
     } 
     msg += '\n'; 
    } 

    cout << msg.c_str(); 

    return 0; 
} 
+0

Comment les enlever du reste de l'alphabet A-Z mec? –

0

Appel GetLogicalDrives(). Les bits mis à zéro correspondent aux lettres de lecteur inutilisées (à l'exception bien sûr des bits 26-31)

0

La manière la plus simple d'utiliser GetLogicalDrives() et d'obtenir les lettres de lecteur disponibles consiste à utiliser une liste de chaînes. Avec l'index des chaînes liant à la position du bit représentant le lecteur dans le masque de bits retourné par GetLogicalDrives(). Voici un exemple utilisant QStringList

DWORD bitmask = GetLogicalDrives(); 
QStringList driveList = QStringList(); 
//Can add the rest of the alphabet. 
driveList << "a:" << "b:" << "c:" << "d:" << "e:" << "f:" << "g:" << "h:" << "i:"; 
for(int i = 0; i < driveList.size(); i++) 
{ 
    if((bitmask & (1 << i)) == 0) //Shift bitmask and if 0 drive is free 
    { 
     driveList.at(i) // String of the free drive. 
    } 
} 
Questions connexes