Нужно получить объем физической памяти компьютера и имя файловой системы на с++

Нужно получить объем физической и оперативной памяти компьютера и имя файловой системы на с++. Объем оперативной памяти уже узнал.

По факту как я понял из задания. Нам нужно собрать именно информацыю по всем дискам. Точнее сколько в каком диске памяти. Пытался что-то сделать через GetLogicalDriveStrings(), но попытки четны!

#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <stdlib.h>
#include <tchar.h>
#include <iostream>
#include <map>
#include <string>
using namespace std;

#include <atlstr.h>

bool dirExists(const std::string& dirName_in)
{
    DWORD ftyp = GetFileAttributesA(dirName_in.c_str());
    if (ftyp == INVALID_FILE_ATTRIBUTES)
        return false;  //something is wrong with your path!

    if (ftyp & FILE_ATTRIBUTE_DIRECTORY)
        return true;   // this is a directory!

    return false;    // this is not a directory!
}
void GetInfo()
{
    int n;
    bool Flag;
    DWORD dr = GetLogicalDrives(); // функция возвращает битовую маску
    for (int x = 0; x < 26; x++) // прогоняем по битам
    {
        n = ((dr >> x) & 1); // определяем значение текущего бита
        if (n) // если единица - диск с номером x есть
        {
            //переобразовуємо TCHAR to string
            std::string DiskName(CT2CA(CString(TCHAR(65 + x))));//отримуємо літеру диска
            string lPath = DiskName + ":\\";//отримуємо назву диска
            WORD OldErrorMode;
            OldErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS); // убираем показ ошибок
            bool ready = dirExists(lPath); // пытаемcя открыть корневую директорию
            SetErrorMode(OldErrorMode); // восстанавливаем старый режим показа ошибок
            if (ready)
            {
                UINT drive_type = GetDriveType((LPCWSTR)(DiskName + ":\\").c_str()); // определяем тип диска
                cout << "\nDisk type: ";
                if      (drive_type == DRIVE_REMOVABLE) cout << "REMOVABLE";
                else if (drive_type == DRIVE_FIXED)     cout << "FIXED";
                else if (drive_type == DRIVE_REMOTE)    cout << "REMOTE";
                else if (drive_type == DRIVE_CDROM)     cout << "CD-ROM";
                else if (drive_type == DRIVE_RAMDISK)   cout << "RAMDISK";
                else cout << "Unknown Type\n";
                unsigned __int64 FreeBytesAvailable;
                unsigned __int64 TotalNumberOfBytes;
                unsigned __int64 TotalNumberOfFreeBytes;
                char drive_label[30];
                char drive_fat[30];
                DWORD drive_sn;
                DWORD drive_name_size = sizeof(drive_label);

                // получаем данные о размерах

                Flag = ::GetDiskFreeSpaceEx((LPCWSTR)(DiskName + ":\\").c_str(),
                    (PULARGE_INTEGER)&FreeBytesAvailable,
                    (PULARGE_INTEGER)&TotalNumberOfBytes,
                    (PULARGE_INTEGER)&TotalNumberOfFreeBytes
                );
                if (Flag)
                {
                    cout << "\nСвободно на диске: " + to_string(TotalNumberOfFreeBytes) + "\n";
                    cout << "Всего на диске: " + to_string(TotalNumberOfBytes) + "\n";
                }
                else
                {
                    cout << "Ошибка в GetDiskFreeSpaceEx\n";
                }

                // получаем метку, серийный номер и пр.
                Flag = GetVolumeInformation((LPWSTR)lPath.c_str(), (LPWSTR)drive_label, sizeof(drive_label), &drive_sn, &drive_name_size, NULL, (LPWSTR)drive_fat, sizeof(drive_fat));

                if (Flag)
                {
                    cout << "\nМетка тома: " + string(drive_label) + "\n";
                    cout << "Сер.номер: " + to_string(drive_sn) + "\n";
                    cout << "Файловая система: " + string(drive_fat) + "\n";
                }
                else
                {
                    cout << "Ошибка в GetVolumeInformation\n";
                }
            }
        }
        else
        {
            cout << "НЕ ГОТОВ";
        }
    }
}
int main()
{
    GetInfo();
}

Написал вот такой код. Но почему-то flag у меня всегда возвращается false. Не могу понять почему, ибо вроде же все делаю правильно. Заранее благодарен!


Ответы (2 шт):

Автор решения: Izviniaus

попробуйте этот код:

ULONGLONG memory = 0;
GetPhysicallyInstalledSystemMemory(&memory);

P.S. это для RAM памяти

→ Ссылка
Автор решения: Oleg Гуменюк
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <stdlib.h>
#include <tchar.h>
#include <iostream>
#include <map>
#include <string>
#include <atlstr.h>
using namespace std;

bool dirExists(const std::string& dirName_in)
{
    DWORD ftyp = GetFileAttributesA(dirName_in.c_str());
    if (ftyp == INVALID_FILE_ATTRIBUTES)
        return false;  //something is wrong with your path!

    if (ftyp & FILE_ATTRIBUTE_DIRECTORY)
        return true;   // this is a directory!

    return false;    // this is not a directory!
}
void GetInfo()
{
    int n;
    bool Flag;
    DWORD dr = GetLogicalDrives(); // функция возвращает битовую маску
    for (int x = 0; x < 26; x++) // прогоняем по битам
    {
        n = ((dr >> x) & 1); // определяем значение текущего бита
        if (n) // если единица - диск с номером x есть
        {
            //переобразовуємо TCHAR to string
            std::string DiskName(CT2CA(CString(TCHAR(65 + x))));//отримуємо літеру диска
            string lPath = DiskName + ":\\";//отримуємо назву диска
            WORD OldErrorMode;
            OldErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS); // убираем показ ошибок
            bool ready = dirExists(lPath); // пытаемcя открыть корневую директорию
            SetErrorMode(OldErrorMode); // восстанавливаем старый режим показа ошибок
            if (ready)
            {
                UINT drive_type = GetDriveTypeA(lPath.c_str()); // определяем тип диска
                cout << "\nDisk type: ";
                if      (drive_type == DRIVE_REMOVABLE) cout << "REMOVABLE";
                else if (drive_type == DRIVE_FIXED)     cout << "FIXED";
                else if (drive_type == DRIVE_REMOTE)    cout << "REMOTE";
                else if (drive_type == DRIVE_CDROM)     cout << "CD-ROM";
                else if (drive_type == DRIVE_RAMDISK)   cout << "RAMDISK";
                else cout << "Unknown Type\n";
                unsigned __int64 FreeBytesAvailable;
                unsigned __int64 TotalNumberOfBytes;
                unsigned __int64 TotalNumberOfFreeBytes;

                //конвертуємо нашу строку в wstring а потім у LPCWSTR
                wstring temp = wstring(lPath.begin(), lPath.end());
                LPCWSTR lLPCWSTRPath = temp.c_str();

                Flag = ::GetDiskFreeSpaceEx(lLPCWSTRPath,
                    (PULARGE_INTEGER) & FreeBytesAvailable,
                    (PULARGE_INTEGER) & TotalNumberOfBytes,
                    (PULARGE_INTEGER) & TotalNumberOfFreeBytes);

                if (Flag)
                {
                    __int64 FreeGiga = TotalNumberOfFreeBytes / 1024 / 1024 / 1024;
                    __int64 TotalGiga = TotalNumberOfBytes    / 1024 / 1024 / 1024;
                    cout << "\nСвободно на диске: " + to_string(FreeGiga) + "\n";
                    cout << "Всего на диске: " + to_string(TotalGiga) + "\n";
                }
                else cout << "Ошибка в GetDiskFreeSpaceEx\n";

                USES_CONVERSION_EX;
                LPWSTR afjha = A2W_EX(lPath.c_str(), lPath.length());
                _TCHAR FileSysteNameT[32] = _T("");
                Flag = GetVolumeInformation(afjha, NULL, NULL, NULL, NULL, NULL, FileSysteNameT, 32);

                wstring FileSysteNameW(&FileSysteNameT[0]); //convert to wstring
                string FileSysteNameS(FileSysteNameW.begin(), FileSysteNameW.end()); //and convert to string.

                if (Flag)   cout << "Файловая система: " + FileSysteNameS + "\n";
                else        cout << "Ошибка в GetVolumeInformation\n";
            }
        }
    }
}
int main()
{
    GetInfo();
}

Вопрос решил. Получилось такое. А теперь главный прикол. Я понимаю что по факту можно получить память компа просто прибавляя память всех существующих дисков. Но нету ли способа по адекватней?)))

→ Ссылка