Russian Qt Forum

Qt => Общие вопросы => Тема начата: Firefox от Февраль 27, 2010, 08:51



Название: свободное место на диске
Отправлено: 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);


Название: Re: свободное место на диске
Отправлено: Rcus от Февраль 27, 2010, 10:15
Это серьезно? Вы преобразуете указатель на объект к POD типу и удивляетесь тому что не работает?

const ushort * QString::utf16 () const /*hint-hint*/


Название: Re: свободное место на диске
Отправлено: Firefox от Февраль 27, 2010, 12:02
спасибо))  
Код:
LPCWSTR=L"C:"
работает без ошибок.
ещё такой вопрос у меня выходит в формате DWORD
FreeBytesAvailable 14
TotalNumberOfByte 2785591296
TotalNumbetOfFreeBytes 394878976

перевела числа домножив на 8 в байты  2785591296*8=22284730368 сравнила с общей ёмкостью диска С в байтах(смотрела в свойствах диска С) она 62915133440.не сходиться.... чего-то я не догоняю почему.


Название: Re: свободное место на диске
Отправлено: Пантер от Февраль 27, 2010, 12:49
Ты умножила байты на 8 и получила байты? Интересно...


Название: Re: свободное место на диске
Отправлено: Rcus от Февраль 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;
Буквально в два перехода находится.


Название: Re: свободное место на диске
Отправлено: Firefox от Февраль 27, 2010, 15:39
если я правильно понимаю, то DWORD это 64 бита или 8 байт, а у меня результат в DWORD  возвращается и надо, чтоб в байты перевести, умножить на 8 и ещё умножить на 2. но всё равно числа не сходяться, получется что ёмкость диска 44569460688. число отличается.
если мои суждения не правильны, то подскажите чайнику, как точно получить(перевести) результат по ёмкости диска и свободного места на нём в байтах.


Название: Re: свободное место на диске
Отправлено: BRE от Февраль 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 битное число
 


Название: Re: свободное место на диске
Отправлено: pastor от Февраль 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.



Название: Re: свободное место на диске
Отправлено: lit-uriy от Февраль 27, 2010, 20:16
>>если я правильно понимаю, то DWORD это 64 бита или 8 байт,
>>а у меня результат в DWORD  возвращается и надо, чтоб в байты перевести,
Возвращаемое значение и есть размер в байтах, но чтобы можно было вернуть значение больше 256, например 1024, нужно иметь больше 8 бит.
Другими словами, DWORD умножать на 8 не нужно.

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


Название: Re: свободное место на диске
Отправлено: Firefox от Март 01, 2010, 11:15
Спасибо всем большое :-*


Название: Re: свободное место на диске
Отправлено: niXman от Март 02, 2010, 12:17
Код
C++ (Qt)
#include <boost/filesystem.hpp>
 
boost::filesystem::space_info spaces = boost::filesystem::space(L"c:\\");
 


Название: Re: свободное место на диске
Отправлено: ритт от Март 02, 2010, 14:23
подключать буст ради обёртки над винапишным вызовом? )


Название: Re: свободное место на диске
Отправлено: niXman от Март 02, 2010, 18:27
Константин, ну кому-то может и нужно подключать, а у кого-то это основа всех программ. ;)


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


Название: Re: свободное место на диске
Отправлено: BRE от Март 03, 2010, 16:00
у меня такой вопросик. дело в том, что диск размер которого мне надо узнать находиться на другом компе. и я формирую  путь таким способом
Код:
QString ip_addr;
LPCWSTR str= L"\\\\" + ip_addr + L"\\E:";
но это не правильно. пишет, что невозможно преобразовать QString в LPCWSTR. а я не понимаю? как правильно записать.LPCWSTR - плохо представлю как обращаться с этим указателем на WCHAR*.
Посмотри на первый ответ в этой тем.
С указателями так работать нельзя. Лучше для формирования строки использовать QString, а потом преобразовывать ее к LPCWSTR, как подсказал Rcus.


Название: Re: свободное место на диске
Отправлено: Пантер от Март 03, 2010, 17:25
\\E: -> \\E\\


Название: Re: свободное место на диске
Отправлено: Firefox от Март 17, 2010, 12:08
Код:
QString str = "\\\\"+ip+"\\E:";
ULARGE_INTEGER FreeBytesAvailable;
ULARGE_INTEGER TotalNumberOfBytes;
ULARGE_INTEGER TotalNumberOfFreeBytes;
 
bool Rezalt=GetDiskFreeSpaceEx( str.utf16(), &FreeBytesAvailable, &TotalNumberOfBytes, &TotalNumberOfFreeBytes );
 
qint64 bytesAvailable = FreeBytesAvailable.QuadPart; // 64 битное число
функция возвращает false.ip - это адрес компьютера в сети, он определяется правильно - это точно.
подскажите как исправить.


Название: Re: свободное место на диске
Отправлено: Пантер от Март 17, 2010, 12:24
Firefox, ты мой пост выше читала?


Название: Re: свободное место на диске
Отправлено: Firefox от Март 17, 2010, 13:11
извиняюсь, не видела второй страницы, теперь всё работает. спасибо :-*и не злитесь, я очень рассеяная просто.