Задать вопрос
FluffyMan
@FluffyMan

Как узнать, хватит ли места на диске при копировании файла?

Задача следующая: копируется файл, если место на диске закончилось, то остановить копирование и выдать предупреждение пользователю. необходима кроссплатформенная реализация (виндовс — линукс) на Qt.

видел эту функцию в интернете:
#ifdef _WIN32
    #include <windows.h>
#else // linux stuff
    #include <sys/vfs.h>
    #include <sys/stat.h>
#endif // _WIN32

bool getFreeTotalSpace(const QString& sDirPath,double& fTotal, double& fFree)
{
#ifdef _WIN32

    QString sCurDir = QDir::current().absPath();
    QDir::setCurrent( sDirPath );
    
    ULARGE_INTEGER free,total;
    bool bRes = ::GetDiskFreeSpaceExA( 0 , &free , &total , NULL );
    if ( !bRes ) return false;

    QDir::setCurrent( sCurDir );

    fFree = static_cast<double>( static_cast<__int64>(free.QuadPart) ) / fKB;
    fTotal = static_cast<double>( static_cast<__int64>(total.QuadPart) ) / fKB

#else //linux

    struct stat stst;
    struct statfs stfs;

    if ( ::stat(sDirPath.local8Bit(),&stst) == -1 ) return false;
    if ( ::statfs(sDirPath.local8Bit(),&stfs) == -1 ) return false;

    fFree = stfs.f_bavail * ( stst.st_blksize / fKB);
    fTotal = stfs.f_blocks * ( stst.st_blksize / fKB );

#endif // _WIN32

    return true;
}


но не могу в ней разобраться. подскажите как ее использовать. что именно непонятно: возвращается булевое значение — это ответ «места на диске нет\есть»? и что такое fKB.

заранее спасибо
  • Вопрос задан
  • 4166 просмотров
Подписаться 2 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 3
@agmt
Почему бы не заиспользовать posix_fallocate? Ну или более кроссовый QFile::seek(needSize-1); QFile::write("", 1);
Ответ написан
rasa
@rasa
Булевое — потому что функция на С++, результат возвращается в fTotal и в fFree
fKB = 1024
Ответ написан
@vScherba
Можно также стандартным std::ofstream ofs(имя_файла); ofs.seekp(нужный_размер); ofs << '\0';
Этот код, как и версия от agmt резервирует файл на диске нужного размера. Если места не хватит, обрабатывайте ошибку. Если ошибки не возникло, у Вас есть гарантированно выделенное место на диске, которое никто не займет.
В Вашем же примере, после определения достаточности места, другое приложение может заполнить диск, и об этом Вы узнаете только во время непосредственной записи в файл.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы