Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2011, 19:30   #1
Диман56
Форумчанин
 
Регистрация: 02.11.2010
Сообщений: 103
По умолчанию GetDiskFreeSpaceEx, ошибка в определении объёма.

Функция неправильно определяет объём жесткого диска. Вот программа:
Код:
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <Windows.h>
#pragma comment ( lib, "Kernel32.lib" )
int _tmain(int argc, _TCHAR* argv[])
{
DWORD FreeBytesAvailable;   
DWORD TotalNumberOfBytes;
DWORD TotalNumberOfFreeBytes;
LPCWSTR disk=L"J:\\";
GetDiskFreeSpaceEx(disk,
(PULARGE_INTEGER)&FreeBytesAvailable, 
(PULARGE_INTEGER)&TotalNumberOfBytes, 
(PULARGE_INTEGER)&TotalNumberOfFreeBytes
);
printf("Total Memory %lf Gb\n",(long double)TotalNumberOfBytes/1024/1024/1024);
_getch();
}
Если объём раздела J первого диска определяет без ошибок(3 с копейками гигов), то объём С и Е(Е на другом физическом диске, С-на том же, что и J) определяется неверно(объём С 68.5 гигов, программа выдаёт 0.52 гигов, объём E 465 гигов, выдает программа, что 1.75 гигов). Где косяк?
Диман56 вне форума Ответить с цитированием
Старый 01.11.2011, 19:45   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

В размерах - нужен не DWORD, а ULARGE_INTEGER, или как он там. DWORD - это 32 разряда, в которые "влезает" не больше 4 Гб (отсюда и лимит на память на 32-разрядных системах).
Abstraction вне форума Ответить с цитированием
Старый 01.11.2011, 19:52   #3
Диман56
Форумчанин
 
Регистрация: 02.11.2010
Сообщений: 103
По умолчанию

И как это исправить? Вместо DWORD вставляю ULARGE_INTEGER, сразу ошибки выводить начинает. Что надо еще, кроме DWORD убрать?)
Диман56 вне форума Ответить с цитированием
Старый 01.11.2011, 20:22   #4
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Код:
__int64 FreeBytesAvailable;
__int64 TotalNumberOfBytes;
__int64 TotalNumberOfFreeBytes;
An1ka вне форума Ответить с цитированием
Старый 02.11.2011, 13:50   #5
Диман56
Форумчанин
 
Регистрация: 02.11.2010
Сообщений: 103
По умолчанию

Спасибо) Программа теперь выводит всё верно)
Диман56 вне форума Ответить с цитированием
Старый 02.11.2011, 18:01   #6
Диман56
Форумчанин
 
Регистрация: 02.11.2010
Сообщений: 103
По умолчанию

Всплыл ещё косяк. Попытался вывести информацию для всех дисков.
Код:
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <Windows.h>
#pragma comment ( lib, "Kernel32.lib" )
int _tmain(int argc, _TCHAR* argv[])
{
int i;
_int64 FreeBytesAvailable;   
_int64 TotalNumberOfBytes;
_int64 TotalNumberOfFreeBytes;
LPCWSTR disk=L"I:\\";
LPCWSTR diski[26]={L"A:\\",L"B:\\",L"C:\\",L"D:\\",L"E:\\",L"F:\\",L"G:\\",L"H:\\",L"I:\\",L"J:\\",L"K:\\",L"L:\\",L"M:\\",L"N:\\"
,L"O:\\",L"P:\\",L"Q:\\",L"R:\\",L"S:\\",L"T:\\",L"U:\\",L"V:\\",L"W:\\",L"X:\\",L"Y:\\",L"Z:\\"};
for(i=0;i<26;i++)
{
GetDiskFreeSpaceEx(diski[i],
(PULARGE_INTEGER)&FreeBytesAvailable, 
(PULARGE_INTEGER)&TotalNumberOfBytes, 
(PULARGE_INTEGER)&TotalNumberOfFreeBytes);
if (GetDriveType(diski[i])!=(DRIVE_UNKNOWN || DRIVE_NO_ROOT_DIR))
{
printf("%s\n", diski[i]);
printf("Total Memory %lf Gb\n",(long double)TotalNumberOfBytes/1024/1024/1024);
printf("Free %lf Gb\n",(long double)TotalNumberOfFreeBytes/1024/1024/1024);
}
else
{
continue;
}
}
_getch();
Для виртуальных дисков и для ДВД-РОМА(диск не вставлен), пишет объём и свободное место для какого-либо из жестких дисков. То есть один и тот же объём повторяется. В чем зарыты грабли?
Диман56 вне форума Ответить с цитированием
Старый 06.03.2013, 10:51   #7
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Диман56 Посмотреть сообщение
Для виртуальных дисков и для ДВД-РОМА(диск не вставлен), пишет объём и свободное место для какого-либо из жестких дисков. То есть один и тот же объём повторяется. В чем зарыты грабли?
надо занулить переменные с размерами в начале цикла.
та же фигня будет и с жесткими, если к ним нет доступа. Например, при выполнении "chkdsk F: /f /x" или при форсированном форматировании. Будет выдавать размер предыдущего диска.

Последний раз редактировалось BLACK_RAIN; 06.03.2013 в 10:57.
BLACK_RAIN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа по вычислению объёма функции z=x^2+y^2 ivan.tiran Паскаль, Turbo Pascal, PascalABC.NET 5 28.09.2011 19:58
Задача про округление объёма проданной газировки [Паскаль] balla Помощь студентам 0 04.12.2010 11:24
Ошибка в определении высоты блочного элемента. vedro-compota HTML и CSS 4 03.11.2010 20:31
Подсчёт объёма отправленных данных в TClientSocket Cold_Night Работа с сетью в Delphi 0 06.03.2010 12:56
Ошибка при определении принтера Robin_ Общие вопросы Delphi 1 14.12.2008 02:05