Не получается воспользоватся GetDiskFreeSpaceEx
char *buf=new char[1024];
if(::GetDiskFreeSpaceEx(buf1,(PULARGE_INTEGER)&FBA,(PULARGE_INTEGER)&TNOB,(PULARGE_INTEGER)&TNOFB)==true)
{
sprintf(buf,"%d",TNOFB);
MessageBox(0,buf3,"ttt",MB_OK);
}
typedef struct _DRIVE_INFO
{
char RootPath[MAX_PATH_SIZE];
char RemotePath[MAX_PATH_SIZE];
char Volume[MAX_PATH_SIZE];
char System[MAX_PATH_SIZE];
DWORD Serial;
DWORD Type;
DWORD TotalSize;
DWORD FreeSize;
} DRIVE_INFO, *PDRIVE_INFO, *LPDRIVE_INFO;
//*************************************************************
//*
//* Получить данные о логическом диске
//*
//*************************************************************
BOOL XSystemInfo::GetDriveInfo(LPSTR pName, LPDRIVE_INFO pInfo)
{
//****
ULARGE_INTEGER TotalNumberOfBytes;
ULARGE_INTEGER TotalNumberOfFreeBytes;
CHAR drive[MAX_PATH_SIZE];
DWORD size;
DWORD oldmode;
// проверка параметров на корректность
if( !pName ) return FALSE;
if( !pInfo ) return FALSE;
// обнуляем значения
wsprintf(pInfo->RootPath,"");
wsprintf(pInfo->RemotePath,"");
wsprintf(pInfo->Volume,"");
wsprintf(pInfo->System,"");
pInfo->Serial = 0;
pInfo->Type = 0;
pInfo->TotalSize = 0;
pInfo->FreeSize = 0;
// получаем список логических дисков в системе
if( GetLogicalDriveStrings(MAX_PATH_SIZE,drive) )
{
// начинаем анализ имен по списку
for( int i=0; drive!=0x00; i+=4 )
{
// преобразуем регистр для сверки
if( *(pName) > 'Z' )
{
if( drive <= 'Z' ) drive += 32;
}
else
{
if( drive > 'Z' ) drive -= 32;
}
// если имя диска совпало получаем его параметры
if( drive == *(pName) )
{
// прописываем корневой путь к диску
wsprintf(pInfo->RootPath,"%s:",pName);
// создаем имя диска с : на конце для получения параметров
wsprintf(drive,"%s:",pName);
// получаем тип диска
pInfo->Type = (DWORD)GetDriveType(drive);
// если диск сетевой (удаленный)
if( pInfo->Type == DRIVE_REMOTE )
{
// получаем удаленный путь к нему
WNetGetConnection(drive,pInfo->RemotePath,&(size=MAX_PATH_SIZE));
}
// создаем имя диска с \ на конце для получения параметров
wsprintf(drive,"%s:\\",pName);
// устанавливаем запрет на выдачу сообщений об ошибках
oldmode = SetErrorMode(SEM_FAILCRITICALERRORS);
// получаем данные о метке, серийном номере и типе вайловой системы
GetVolumeInformation(drive,pInfo->Volume,MAX_PATH_SIZE,&pInfo->Serial,NULL,NULL,pInfo->System,MAX_PATH_SIZE);
// получаем данные о полном и свободном объеме
TotalNumberOfBytes.QuadPart = TotalNumberOfFreeBytes.QuadPart = 0;
GetDiskFreeSpaceEx(drive,NULL,&TotalNumberOfBytes,&TotalNumberOfFreeBytes);
// востанавливаем старые настройки
SetErrorMode(oldmode);
// обьем сохраняем в килобайтах
pInfo->TotalSize = (DWORD)(TotalNumberOfBytes.QuadPart / 1024);
pInfo->FreeSize = (DWORD)(TotalNumberOfFreeBytes.QuadPart / 1024);
return TRUE;
}
}
}
return FALSE;
}
fResult = pGetDiskFreeSpaceEx (pszDrive,
(PULARGE_INTEGER)&i64FreeBytesToCaller,
(PULARGE_INTEGER)&i64TotalBytes,
(PULARGE_INTEGER)&i64FreeBytes);
if(fResult)
{
printf("Total free bytes = %I64d\n", i64FreeBytes);
}
Я привел свою процедурину целиком так как при вызове различных дисковых функций там есть нюанс как оно задается ( или х: или х:\ в вашем случае )...
И исчо - sprintf - Вы уверены что он выдаст правильное значение если больше 4Г...
В байтах
ЗЫ:диск задается как "х:\"
Нет.
Возвращаемая величина - 32-разрядное целое, поэтому, очевидно, объем, выраженный в байтах, для современных винчестеров она возвращать не может. Поэтому сделано просто: возвращаемое системой значение делится на 1024.
В результате, максимальный объем диска, который данная методика может возвратить, составляет 2 Тбайта. Что уже очень близко к объемам современных накопителей. Логичнее было бы возвращать размер в Мбайтах, раз уж мы отступили от байтов.
И, опять же, по существующим стандартам принято делить не на 1024, а на 1000. По крайней мере, именно так измеряется объем дисковых накопителей (кроме дискет, у которых свой бардак).
Возвращаемая величина - 32-разрядное целое, поэтому, очевидно, объем, выраженный в байтах, для современных винчестеров она возвращать не может. Поэтому сделано просто: возвращаемое системой значение делится на 1024.
В результате, максимальный объем диска, который данная методика может возвратить, составляет 2 Тбайта. Что уже очень близко к объемам современных накопителей. Логичнее было бы возвращать размер в Мбайтах, раз уж мы отступили от байтов.
И, опять же, по существующим стандартам принято делить не на 1024, а на 1000. По крайней мере, именно так измеряется объем дисковых накопителей (кроме дискет, у которых свой бардак).
Прежде, чем спорить, ты бы потрудился открыть MSDN.
lpTotalNumberOfFreeBytes
A pointer to a variable that receives the total number of free bytes on a disk.
От туда же ты мог бы выяснить, что возвращаемые величины (их три, не считая результата выполнения функции) являются 64-битными целыми (ULARGE_INTEGER).
char buf1[10]="c:";
char *buf=new char[1024];
if(::GetDiskFreeSpaceEx(buf1,(PULARGE_INTEGER)&FBA,
(PULARGE_INTEGER)&TNOB,(PULARGE_INTEGER)&TNOFB))
sprintf (buf,"%Ld",TNOFB.QuadPart);
//MessageBox(0,buf3,"ttt",MB_OK);
delete [] buf;
Возвращаемая величина - 32-разрядное целое, поэтому, очевидно, объем, выраженный в байтах, для современных винчестеров она возвращать не может. Поэтому сделано просто: возвращаемое системой значение делится на 1024.
В результате, максимальный объем диска, который данная методика может возвратить, составляет 2 Тбайта. Что уже очень близко к объемам современных накопителей. Логичнее было бы возвращать размер в Мбайтах, раз уж мы отступили от байтов.
И, опять же, по существующим стандартам принято делить не на 1024, а на 1000. По крайней мере, именно так измеряется объем дисковых накопителей
:D:D:D:D
шедевр.