Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не получается воспользоватся GetDiskFreeSpaceEx

841
28 сентября 2008 года
_nic
199 / / 29.07.2006
Как правильно заюзать это ф-цию?У меня не получается :(
 
Код:
char buf1[10];
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);
}
Для флопика в lpTotalNumberOfFreeBytes оказывается число по значению близкое к полтора гигабайтам :eek: Для диска С: 750 мегабайт хотя там свободно только 300.Как правильно работать с этой ф-цией?
342
29 сентября 2008 года
Yos
209 / / 21.06.2003
Вот функция, получает все (ну практически) о диске. Я так предполагаю что большее по жизни врядли понадобиться...

Код:
//*************************************************************
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;
}
14
29 сентября 2008 года
Phodopus
3.3K / / 19.06.2008
Вот пример с некоторыми вырезками из MSDN
Код:
__int64 i64FreeBytesToCaller, i64TotalBytes, i64FreeBytes;

fResult = pGetDiskFreeSpaceEx (pszDrive,
                 (PULARGE_INTEGER)&i64FreeBytesToCaller,
                 (PULARGE_INTEGER)&i64TotalBytes,
                 (PULARGE_INTEGER)&i64FreeBytes);

if(fResult)
{
   printf("Total free bytes = %I64d\n", i64FreeBytes);
}
841
29 сентября 2008 года
_nic
199 / / 29.07.2006
Незнаю что я делаю не так :( но у меня эта ф-ция выдает значения очень и очень далекие от реальности :confused:
1.9K
30 сентября 2008 года
andriano
474 / / 10.01.2008
А она выдает значение в кибибайтах.
342
30 сентября 2008 года
Yos
209 / / 21.06.2003
Уважаемый _nic, проверьте как вы задаете имя диска...

Я привел свою процедурину целиком так как при вызове различных дисковых функций там есть нюанс как оно задается ( или х: или х:\ в вашем случае )...

И исчо - sprintf - Вы уверены что он выдаст правильное значение если больше 4Г...
3
30 сентября 2008 года
Green
4.8K / / 20.01.2000
Цитата: andriano
А она выдает значение в кибибайтах.


В байтах

841
30 сентября 2008 года
_nic
199 / / 29.07.2006
забыл добавить что только в переменную lpTotalNumberOfFreeBytes возвращается какое то число,в других перменных нули :confused:
ЗЫ:диск задается как "х:\"
14
30 сентября 2008 года
Phodopus
3.3K / / 19.06.2008
Дебаггер те же значения переменных выводит что и консоль?
1.9K
03 октября 2008 года
andriano
474 / / 10.01.2008
Цитата: Green
В байтах


Нет.
Возвращаемая величина - 32-разрядное целое, поэтому, очевидно, объем, выраженный в байтах, для современных винчестеров она возвращать не может. Поэтому сделано просто: возвращаемое системой значение делится на 1024.
В результате, максимальный объем диска, который данная методика может возвратить, составляет 2 Тбайта. Что уже очень близко к объемам современных накопителей. Логичнее было бы возвращать размер в Мбайтах, раз уж мы отступили от байтов.
И, опять же, по существующим стандартам принято делить не на 1024, а на 1000. По крайней мере, именно так измеряется объем дисковых накопителей (кроме дискет, у которых свой бардак).

3
03 октября 2008 года
Green
4.8K / / 20.01.2000
Цитата: andriano
Нет.
Возвращаемая величина - 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).

38K
16 октября 2008 года
Tooth
38 / / 07.10.2008
 
Код:
ULARGE_INTEGER FBA,TNOB,TNOFB;
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;
38K
16 октября 2008 года
Tooth
38 / / 07.10.2008
Цитата: andriano
Нет.
Возвращаемая величина - 32-разрядное целое, поэтому, очевидно, объем, выраженный в байтах, для современных винчестеров она возвращать не может. Поэтому сделано просто: возвращаемое системой значение делится на 1024.
В результате, максимальный объем диска, который данная методика может возвратить, составляет 2 Тбайта. Что уже очень близко к объемам современных накопителей. Логичнее было бы возвращать размер в Мбайтах, раз уж мы отступили от байтов.
И, опять же, по существующим стандартам принято делить не на 1024, а на 1000. По крайней мере, именно так измеряется объем дисковых накопителей



:D:D:D:D

шедевр.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог