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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Узнать хватит ли места на диске при копировании файла  (Прочитано 6581 раз)
FluffyMan2000
Гость
« : Октябрь 14, 2012, 17:37 »

Добрый день. Нужно при копировании файла узнать, хватит ли места на целевом диске.

нашел такую функцию. Здесь реализация виндовс\линукс. Нужно добавить реализацию под мак.

Код:
#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;
}

отлично, только нужно еще и под MacOS добавить реализацию. подскажите, как это сделать. никогда с маком не сталкивался.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Октябрь 14, 2012, 17:46 »

по идее линуксовая должна прокатить
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
FluffyMan2000
Гость
« Ответ #2 : Октябрь 14, 2012, 18:00 »

хм. тогда качаю образ мака.
Записан
FluffyMan2000
Гость
« Ответ #3 : Октябрь 14, 2012, 21:35 »

люди, кто может, помогите пожалуйста. у кого мак есть. создайте минимальный проект и скомпилируйте эту функцию .просто скажите, компилится или нет. буду признателен (не получается мак поставить на виртуал бокс)
Записан
V1KT0P
Гость
« Ответ #4 : Октябрь 14, 2012, 21:41 »

люди, кто может, помогите пожалуйста. у кого мак есть. создайте минимальный проект и скомпилируйте эту функцию .просто скажите, компилится или нет. буду признателен (не получается мак поставить на виртуал бокс)
А взять готовый образ религия не позволяет? Вот первое попавшее, для VmWare конечно, но тебе-же вроде потестить и все: http://rutracker.org/forum/viewtopic.php?t=3029844
Записан
FluffyMan2000
Гость
« Ответ #5 : Октябрь 14, 2012, 23:18 »

люди, кто может, помогите пожалуйста. у кого мак есть. создайте минимальный проект и скомпилируйте эту функцию .просто скажите, компилится или нет. буду признателен (не получается мак поставить на виртуал бокс)
А взять готовый образ религия не позволяет? Вот первое попавшее, для VmWare конечно, но тебе-же вроде потестить и все: http://rutracker.org/forum/viewtopic.php?t=3029844

забыл сказать. железо не позволяет. поэтому попросил.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Октябрь 15, 2012, 00:07 »

я слегка обманул тебя: в мак ос вместо sys/vfs.h надо подключать sys/mount.h, и если fKB — это из линуксовых хедеров, то в мак ос такого нету.

ну и все-таки не local8Bit(), а toLocal8Bit().
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #7 : Октябрь 15, 2012, 11:28 »

А смысл в этом "узнавании" ?

Например, ты запустил свою тулзу, она указала на то, что места хватит,
начал копировать. И тут вдруг откуда ни возьмись, жесткий вирус из порно сайта
(на который ты зашел пока идет копирование Улыбающийся ) начал забивать все доступное
место на диске мусором. И тебе не хватило места для копирования, и твоя прога говорит "а нет места теперь".

Т.е. сначала она говорит, что место есть, а потом - "извини, места нет".
Так зачем вообще тогда определять доступное место?
Копируй себе да копируй, если скажет нет места - значит нет места. В чем проблема? Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Октябрь 15, 2012, 12:43 »

Копируй себе да копируй, если скажет нет места - значит нет места. В чем проблема? Улыбающийся
Наверное в том что результат незаконченного копирования придется (как-то) вычищать. И вообще есть такое понятие "культура" - которое почему-то всегда совпадает "здесь и там"  Улыбающийся
Записан
Patrin Andrey
Гость
« Ответ #9 : Октябрь 15, 2012, 14:15 »

А разве проверка наличия места нас как-то освобождает от написания уборщика мусора в случае неудачного копирования?
Сам я с файлами редко работаю, но думается надо смотреть в сторону QFile::resize. Правда вот это "If sz is larger than fileName currently is the new bytes will be set to 0" может быть несколько неприятным.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Октябрь 15, 2012, 14:44 »

А разве проверка наличия места нас как-то освобождает от написания уборщика мусора в случае неудачного копирования?
Дело темное - может и есть смысл оставить файлы. Напр была старая версия файла, пере-записалась. Теперь "убрали мусор" - и на стороне приемника ни старого. ни нового  Плачущий Вообще такие задачи выглядят вначале очень простыми ("та ладно, копируй себе"), но если делать добросовестно - забот предостаточно
Записан
FluffyMan2000
Гость
« Ответ #11 : Октябрь 15, 2012, 18:59 »

я слегка обманул тебя: в мак ос вместо sys/vfs.h надо подключать sys/mount.h, и если fKB — это из линуксовых хедеров, то в мак ос такого нету.

ну и все-таки не local8Bit(), а toLocal8Bit().

опечатка. fKb  - это double = 1024
спасибо, попробую.
« Последнее редактирование: Октябрь 15, 2012, 19:49 от FluffyMan2000 » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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