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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Узнать достаточно ли место на жестком диске для записи файла  (Прочитано 8381 раз)
merke
Гость
« : Ноябрь 15, 2010, 13:44 »

Всем привет!

Система Ubuntu

Интересует следующее: как средствами именно Qt узнать хватит ли места на жестком диске(на томе жесткого диска) для создания файла?

Буду рад отзывам.

С уважением, Александр
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #1 : Ноябрь 15, 2010, 13:51 »

Средствами Qt никак.
Записан

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

К сожалению, это под каждую платформу придется писать самому, вот код для linux

Код:
    #include <sys/vfs.h>
    #include <sys/stat.h>

qulonglong getFreeSpace(const QString &path)
    {
        QString apath = QDir(path).absolutePath();

        struct stat stst;
        struct statfs stfs;

        if (::stat(apath.toLocal8Bit(),&stst) == -1)
        {
            return 0;
        }
        if (::statfs(apath.toLocal8Bit(),&stfs) == -1)
        {
            return 0;
        }
        return stfs.f_bavail * (stst.st_blksize);
    }

параметр path это абсолютный или относительный путь до директории в которую хочется записать
« Последнее редактирование: Ноябрь 15, 2010, 15:02 от Vass » Записан
BRE
Гость
« Ответ #3 : Ноябрь 15, 2010, 15:17 »

И про квоты не стоит забывать.
Пользователь может быть ограничен определенным объемом данных, которые он может записать, и оно может быть меньше доступного свободного места на устройстве.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Ноябрь 15, 2010, 16:23 »

BRE
stfs.f_bavail - это и есть квотированное,  отличие от f_bfree
Записан
BRE
Гость
« Ответ #5 : Ноябрь 15, 2010, 17:08 »

BRE
stfs.f_bavail - это и есть квотированное,  отличие от f_bfree
Сам квотами никогда не использовал, поэтому и возможности проверить не было... А точно это значение с учетом квот?
Даже если собрать ядро без поддержки квотирования оно будет резервировать место для root. Эти значения и отражается в этой структуре.
А вот учитываются ли при этом значения квот, если включена их поддержка?
Записан
merke
Гость
« Ответ #6 : Ноябрь 15, 2010, 17:29 »

Спасибо всем!!! Реально выручили!!!
Записан
merke
Гость
« Ответ #7 : Ноябрь 19, 2010, 11:23 »

Попутный вопрос:

а это функция будет работать на всех версиях Linux или только под Ubuntu?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #8 : Ноябрь 19, 2010, 11:45 »

На всех Posix.
Записан

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

спасибо!!!! Подмигивающий
Записан
merke
Гость
« Ответ #10 : Ноябрь 19, 2010, 13:04 »

Вот написал функцию проверки свободного дискового пространства на жестком диске для WIN32 и для LINUX

может кому пригодится!)

Код
C++ (Qt)
#ifdef _WIN32 //Для WIN32
    #include <windows.h>
#else //Для Linux
    #include <sys/vfs.h>
    #include <sys/stat.h>
#endif //WIN32


Код
C++ (Qt)
qulonglong AppArguments::getFreeSpace(const QString &path)
{
#ifdef _WIN32
    QString sCurDir = QDir::current().absPath();
    QDir::setCurrent( path );
 
    double fTotal;
    double fFree;
 
    ULARGE_INTEGER free,total;
    bool bRes = ::GetDiskFreeSpaceExA( 0 , &free , &total , NULL );
    if ( !bRes ) return false;
 
    QDir::setCurrent( sCurDir );
 
    fFree = static_cast<__int64>(free.QuadPart));
    //fTotal = static_cast<double>( static_cast<__int64>(total.QuadPart) ) / fKB;
    return fFree;
#else //linux
 
   QString apath = QDir(path).absolutePath();
 
   struct stat stst;
   struct statfs stfs;
 
   if (::stat(apath.toLocal8Bit(),&stst) == -1)
   {
       return 0;
   }
   if (::statfs(apath.toLocal8Bit(),&stfs) == -1)
   {
       return 0;
   }
   return stfs.f_bavail * (stst.st_blksize);
#endif // _WIN32
}
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #11 : Ноябрь 19, 2010, 13:40 »

Для винды:
Код
C++ (Qt)
bool getDiskFreeSpace (const QString& path, qint64& total, qint64& free, qint64& available) const
{
return GetDiskFreeSpaceEx((wchar_t*) path.utf16(),
(PULARGE_INTEGER)&available ,
(PULARGE_INTEGER)&total ,
(PULARGE_INTEGER)&free );
}
Для Линуха:
Код
C++ (Qt)
bool getDiskFreeSpace(const QString& path, qint64& total, qint64& free, qint64& available) const
{
struct statvfs st;
if(statvfs(QFile::encodeName(path).data(), &st) == 0)
{
total = st.f_frsize * st.f_blocks;
free = st.f_frsize * st.f_bfree;
available = st.f_frsize * st.f_bavail;
 
return true;
}
 
return false;
}
Вот когда-то делалось.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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