Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить свободное место на диске? 
V
    Опции темы
lv151
Дата 8.7.2009, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

Репутация: 1
Всего: 2



Есть файл, как получить свободное место на диске на котором он находится?

Это сообщение отредактировал(а) lv151 - 8.7.2009, 12:49
PM MAIL   Вверх
andrew_121
Дата 8.7.2009, 13:22 (ссылка) |   (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 2
Всего: 33



Цитата(lv151 @  8.7.2009,  12:48 Найти цитируемый пост)
как получить свободное место на диске на котором он находится?

Т.е. как узнать сколько на диске свободного места?
Если да:
Код

bool GetDiskSpace( const QString& path, quint64* total, quint64* free ) {
   typedef BOOL (WINAPI *GetDiskFreeSpaceEx_t)(LPCTSTR,PULARGE_INTEGER, PULARGE_INTEGER,PULARGE_INTEGER);
   GetDiskFreeSpaceEx_t pGetDiskFreeSpaceEx = (GetDiskFreeSpaceEx_t)
      ::GetProcAddress ( ::GetModuleHandle( L"kernel32.dll" ),"GetDiskFreeSpaceExA" );
   if ( pGetDiskFreeSpaceEx ) {
      ULARGE_INTEGER _total, _free;
      SetErrorMode( SEM_FAILCRITICALERRORS );
      if ( !pGetDiskFreeSpaceEx((LPCTSTR)qPrintable(path), &_free, &_total, NULL ) ) {
         SetErrorMode( 0 );
         if ( free ) *free = 0;
         if ( total )*total= 0;
         return false;
      }
      SetErrorMode( 0 );
      if ( total ) {
         *total = _total.QuadPart;
      }
      if ( free ) {
         *free = _free.QuadPart;
      }
    } else {
       return false;
   }
   return true;
}


Это сообщение отредактировал(а) andrew_121 - 8.7.2009, 16:05


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Andrey44
Дата 8.7.2009, 14:06 (ссылка)  | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



GetLogicalDrives->GetDriveType->_getdiskfree


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
lv151
Дата 8.7.2009, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

Репутация: 1
Всего: 2



Делаю вот так, но число получается какое то странное.
...
*free = lBytesPerCluster * lNumberOfFreeClusters;
...
Если это это число в байтах, то неправильно.

Это сообщение отредактировал(а) lv151 - 8.7.2009, 14:52
PM MAIL   Вверх
andrew_121
Дата 8.7.2009, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 2
Всего: 33



lv151, Вообще, на виндах от 2000 и выше, эта часть кода не должна выполняться.

Добавлено через 1 минуту и 11 секунд
Чему равняется pGetDiskFreeSpaceEx? Null-у?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
lv151
Дата 8.7.2009, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

Репутация: 1
Всего: 2



Цитата(andrew_121 @  8.7.2009,  15:15 Найти цитируемый пост)
lv151, Вообще, на виндах от 2000 и выше, эта часть кода не должна выполняться.

Добавлено через 1 минуту и 11 секунд
Чему равняется pGetDiskFreeSpaceEx? Null-у?

нет
PM MAIL   Вверх
andrew_121
Дата 8.7.2009, 16:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 2
Всего: 33



lv151, Тогда чего ты от тех строк ждешь? Они же не выполняются.

Добавлено через 2 минуты и 23 секунды
Поправил. Так проще. Чтоб остальной код глаза не мозолил)


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
lv151
Дата 8.7.2009, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

Репутация: 1
Всего: 2



Всё равно свободное место не правильно считается.

PM MAIL   Вверх
andrew_121
Дата 8.7.2009, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 2
Всего: 33



lv151, Диск сжатый?
Просто я только что проверил. Все правильно!


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
lv151
Дата 8.7.2009, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

Репутация: 1
Всего: 2



вот так указываю диск "d:\\".
не сжатый.

вместо QString я использую CString, вместо quint64* DWORD&.

Это сообщение отредактировал(а) lv151 - 8.7.2009, 17:05
PM MAIL   Вверх
andrew_121
Дата 8.7.2009, 17:09 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 2
Всего: 33



Цитата(lv151 @  8.7.2009,  16:56 Найти цитируемый пост)
DWORD

Это не тот тип) Это 32-ух битный. Он способен хранить значения только до 4гиг.

Вот:
Код

#include <iostream>
#include <string>
#include <windows.h>

bool get_disk_space(const std::string &path,
                            unsigned long long *total,
                            unsigned long long *used,
                            unsigned long long *free)
{
    ULARGE_INTEGER _total;
    ULARGE_INTEGER _free;
    ULARGE_INTEGER _used;
   typedef BOOL (WINAPI *GetDiskFreeSpaceEx_t)(LPCTSTR,PULARGE_INTEGER, PULARGE_INTEGER,PULARGE_INTEGER);

   GetDiskFreeSpaceEx_t pGetDiskFreeSpaceEx = (GetDiskFreeSpaceEx_t)
      ::GetProcAddress(::GetModuleHandle(L"kernel32.dll"),"GetDiskFreeSpaceExA");

   if ( pGetDiskFreeSpaceEx ) {

      SetErrorMode(SEM_FAILCRITICALERRORS);
      
      if ( !pGetDiskFreeSpaceEx(reinterpret_cast<LPCTSTR>(path.c_str()), &_free, &_total, &_used) ) {
         SetErrorMode(0);

         if ( total ) *total= 0ULL;
         if ( used )  *used = 0ULL;
         if ( free )  *free = 0ULL;

         return false;
      }

      SetErrorMode(0);

      if ( total ) {
         *total = _total.QuadPart;
      }
      if ( used ) {
         *used = _total.QuadPart - _used.QuadPart;
      }
      if ( free ) {
         *free = _free.QuadPart;
      }
    } else {
       return false;
   }
   return true;
}

int main(int argc, char **argv) {
    
    std::string path("C:");    
    unsigned long long total = 0;
    unsigned long long used = 0;
    unsigned long long free = 0;
    
    bool result = get_disk_space(path, &total, &used, &free);
    
    std::cout<< "Total: " << total<< std::endl
                << "Used : " << used    << std::endl
                << "Free : " << free << std::endl;

    return 0;
}



Это сообщение отредактировал(а) andrew_121 - 8.7.2009, 17:09


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
lv151
Дата 8.7.2009, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

Репутация: 1
Всего: 2



Разобрался.
Нужно было использовать ULARGE_INTEGER.

PM MAIL   Вверх
andrew_121
Дата 8.7.2009, 17:51 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 2
Всего: 33



Цитата(lv151 @  8.7.2009,  17:28 Найти цитируемый пост)
Нужно было использовать ULARGE_INTEGER.

Или unsigned long long. Это стандарт для всех компиляторов и ОС.

Это сообщение отредактировал(а) andrew_121 - 8.7.2009, 17:52


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
andrew_121
Дата 12.7.2009, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 2
Всего: 33



lv151, Тему отметь решенной.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0992 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.