Нужно получить объем физической памяти компьютера и имя файловой системы на с++
Нужно получить объем физической и оперативной памяти компьютера и имя файловой системы на с++. Объем оперативной памяти уже узнал.
По факту как я понял из задания. Нам нужно собрать именно информацыю по всем дискам. Точнее сколько в каком диске памяти. Пытался что-то сделать через 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 шт):
попробуйте этот код:
ULONGLONG memory = 0;
GetPhysicallyInstalledSystemMemory(&memory);
P.S. это для RAM памяти
#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();
}
Вопрос решил. Получилось такое. А теперь главный прикол. Я понимаю что по факту можно получить память компа просто прибавляя память всех существующих дисков. Но нету ли способа по адекватней?)))