Russian Qt Forum
Ноябрь 27, 2024, 02:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: свободное место на диске  (Прочитано 12200 раз)
Firefox
Гость
« : Февраль 27, 2010, 08:51 »

Мне надо посчитать свободное место надиске. написала такую функцию. но непонимаю почему она возвращает всё время false.
Код:
QString str="C:";
DWORD FreeBytesAvailable;
DWORD TotalNumberOfBytes;
DWORD TotalNumberOfFreeBytes;
bool Rezalt;
Rezalt=GetDiskFreeSpaceEx((LPCWSTR)&str, (PULARGE_INTEGER)&FreeBytesAvailable,(PULARGE_INTEGER)&TotalNumberOfBytes,  (PULARGE_INTEGER)&TotalNumberOfFreeBytes);
Записан
Rcus
Гость
« Ответ #1 : Февраль 27, 2010, 10:15 »

Это серьезно? Вы преобразуете указатель на объект к POD типу и удивляетесь тому что не работает?

const ushort * QString::utf16 () const /*hint-hint*/
Записан
Firefox
Гость
« Ответ #2 : Февраль 27, 2010, 12:02 »

спасибо))  
Код:
LPCWSTR=L"C:"
работает без ошибок.
ещё такой вопрос у меня выходит в формате DWORD
FreeBytesAvailable 14
TotalNumberOfByte 2785591296
TotalNumbetOfFreeBytes 394878976

перевела числа домножив на 8 в байты  2785591296*8=22284730368 сравнила с общей ёмкостью диска С в байтах(смотрела в свойствах диска С) она 62915133440.не сходиться.... чего-то я не догоняю почему.
« Последнее редактирование: Февраль 27, 2010, 12:42 от Firefox » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Февраль 27, 2010, 12:49 »

Ты умножила байты на 8 и получила байты? Интересно...
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Rcus
Гость
« Ответ #4 : Февраль 27, 2010, 12:52 »

Ну дык кто msdn то читать будет?
Цитировать
typedef union _ULARGE_INTEGER {
  struct {
    DWORD LowPart;
    DWORD HighPart;
  } ;
  struct {
    DWORD LowPart;
    DWORD HighPart;
  } u;
  ULONGLONG QuadPart;
} ULARGE_INTEGER, *PULARGE_INTEGER;
Буквально в два перехода находится.
Записан
Firefox
Гость
« Ответ #5 : Февраль 27, 2010, 15:39 »

если я правильно понимаю, то DWORD это 64 бита или 8 байт, а у меня результат в DWORD  возвращается и надо, чтоб в байты перевести, умножить на 8 и ещё умножить на 2. но всё равно числа не сходяться, получется что ёмкость диска 44569460688. число отличается.
если мои суждения не правильны, то подскажите чайнику, как точно получить(перевести) результат по ёмкости диска и свободного места на нём в байтах.
Записан
BRE
Гость
« Ответ #6 : Февраль 27, 2010, 16:06 »

Код
C++ (Qt)
LPCWSTR str = L"C:";
ULARGE_INTEGER FreeBytesAvailable;
ULARGE_INTEGER TotalNumberOfBytes;
ULARGE_INTEGER TotalNumberOfFreeBytes;
 
bool Rezalt=GetDiskFreeSpaceEx( str, &FreeBytesAvailable, &TotalNumberOfBytes, &TotalNumberOfFreeBytes );
 
qint64 bytesAvailable = FreeBytesAvailable.QuadPart; // 64 битное число
 
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #7 : Февраль 27, 2010, 16:07 »

Цитировать
The ULARGE_INTEGER structure is actually a union. If your compiler has built-in support for 64-bit integers, use the QuadPart member to store the 64-bit integer. Otherwise, use the LowPart and HighPart members to store the 64-bit integer.

Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Февраль 27, 2010, 20:16 »

>>если я правильно понимаю, то DWORD это 64 бита или 8 байт,
>>а у меня результат в DWORD  возвращается и надо, чтоб в байты перевести,
Возвращаемое значение и есть размер в байтах, но чтобы можно было вернуть значение больше 256, например 1024, нужно иметь больше 8 бит.
Другими словами, DWORD умножать на 8 не нужно.

Для наглядности посмотри на десятичные числа:
256 и 1024
Первое занимает 3 десятичных разряда, а второе уже 4.
Записан

Юра.
Firefox
Гость
« Ответ #9 : Март 01, 2010, 11:15 »

Спасибо всем большое Целующий
Записан
niXman
Гость
« Ответ #10 : Март 02, 2010, 12:17 »

Код
C++ (Qt)
#include <boost/filesystem.hpp>
 
boost::filesystem::space_info spaces = boost::filesystem::space(L"c:\\");
 
Записан
ритт
Гость
« Ответ #11 : Март 02, 2010, 14:23 »

подключать буст ради обёртки над винапишным вызовом? )
Записан
niXman
Гость
« Ответ #12 : Март 02, 2010, 18:27 »

Константин, ну кому-то может и нужно подключать, а у кого-то это основа всех программ. Подмигивающий
Записан
Firefox
Гость
« Ответ #13 : Март 03, 2010, 15:15 »

мне буст не надо подключать, всё и так включено))
у меня такой вопросик. дело в том, что диск размер которого мне надо узнать находиться на другом компе. и я формирую  путь таким способом
Код:
QString ip_addr;
LPCWSTR str= L"\\\\" + ip_addr + L"\\E:";
но это не правильно. пишет, что невозможно преобразовать QString в LPCWSTR. а я не понимаю? как правильно записать.LPCWSTR - плохо представлю как обращаться с этим указателем на WCHAR*.
Записан
BRE
Гость
« Ответ #14 : Март 03, 2010, 16:00 »

у меня такой вопросик. дело в том, что диск размер которого мне надо узнать находиться на другом компе. и я формирую  путь таким способом
Код:
QString ip_addr;
LPCWSTR str= L"\\\\" + ip_addr + L"\\E:";
но это не правильно. пишет, что невозможно преобразовать QString в LPCWSTR. а я не понимаю? как правильно записать.LPCWSTR - плохо представлю как обращаться с этим указателем на WCHAR*.
Посмотри на первый ответ в этой тем.
С указателями так работать нельзя. Лучше для формирования строки использовать QString, а потом преобразовывать ее к LPCWSTR, как подсказал Rcus.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.089 секунд. Запросов: 23.