как получить буквы дисков, которые доступны (не используются) в MFC? - PullRequest
1 голос
/ 28 сентября 2010

как получить буквы дисков, которые доступны (не используются) в MFC с использованием C ++?Любой фрагмент кода ..

Ответы [ 4 ]

2 голосов
/ 28 сентября 2010

От Здесь :

Это дает вам диски, которые используются, просто уберите их из остальной части алфавита 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 голосов
/ 07 августа 2014

Самый простой способ, используя GetLogicalDrives () и получать доступные буквы дисков, - это использовать список строк. С индексом строк, связывающих позицию бита, представляющего диск в битовой маске, возвращаемой GetLogicalDrives (). Вот пример использования 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.
    }
}
0 голосов
/ 28 сентября 2010

Звоните GetLogicalDrives(). Биты, установленные на ноль, соответствуют неиспользованным буквам дисков (кроме, конечно, битов 26-31)

0 голосов
/ 28 сентября 2010

Вы, вероятно, после GetLogicalDrives , это дает вам битовую маску всех букв дисков, используемых системой, вы можете преобразовать их в буквы и добавить их в поле со списком


Чтобы сделать его немного более понятным:

Возвращаемое значение

Если функция завершается успешно, возвращаемое значение представляет собой битовую маску, представляющую текущий доступный дискдиски.Битовая позиция 0 (младший значащий бит) - это диск A, битовая позиция 1 - это диск B, битовая позиция 2 - это диск C и т. Д.

, поэтому GetLogicalDrives() & 1 проверяет, является ли диск AGetLogicalDrives() & 4 проверяет, есть ли диски C

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...