statvfs не может правильно распознать размер папки

У меня есть система Embedded Linux, которая по запросу начинает запись данных на SD-карту. Программное обеспечение, управляющее системой, периодически вызывает функцию проверки количества свободного места на SD-карте, останавливая запись, если она достигает 99% занятости. Код, который я использую, следующий statvfs как функция для чтения папки, в которой хранятся данные:

struct statvfs buff;

const int resp = statvfs("/media/mmcblk0p2/", &buff);

if (resp < 0)
{
const QString strTemp = QString("INTERFACE: An error occurred while trying to read the file system info");

mDebugS(strTemp);
mLog(strTemp);

return;
}

const float size = float(buff.f_bsize * buff.f_blocks) / float(1024 * 1024 * 1024);
const float free = float(buff.f_bsize * buff.f_bfree) / float(1024 * 1024 * 1024);
const float available = float(buff.f_bsize * buff.f_bavail) / float(1024 * 1024 * 1024);
//const float used = size - free;
const float percentUsed = (size - free)/size;   //E.g.: 0.98
const float percentAvailable = available/size;
const float totalStorageTime = size/1.2f * 24.0f;

//const float hoursUsed = percentUsed * totalStorageTime;
const float timeAvailable = percentAvailable * totalStorageTime;

const qint32 hoursLeft = (qint32)timeAvailable;
const qint32 minutesLeft = qint32((timeAvailable - (float)hoursLeft) * 60.0f);//    mDebugS(QString("INTERFACE: mmcblk0p2 info: size: %1 | free: %2 | available: %3 | percent used: %4 | percent available: %5 | totalStorageTime: %6 | time available: %7 \n | hoursLeft: %8 "//                    "| minutes left: %9")
//            .arg(size).arg(free).arg(available).arg(percentUsed).arg(percentAvailable).arg(totalStorageTime).arg(timeAvailable).arg((qint32)timeAvailable)
//            .arg(qint32((timeAvailable - (float)hoursLeft) * 60.0f)));emit signalSetMassMemory(hoursLeft,minutesLeft);

if (percentUsed >= 0.99f)
//...

Примечание: значение 1.2f там относительно скорости записи: 1.2 Гб в день. Я также использую эту функцию, чтобы узнать, сколько осталось времени записи.

Этот алгоритм был сначала протестирован на SD-карте 4 Гб, и он работал нормально. Этот SDC разделен на два раздела, соответствующий называется /media/mmcblk0p2/, Проблема, с которой я сталкиваюсь, заключается в том, что при запуске точного кода в другой системе с другой SD-картой возвращаемые значения размера папки неверны: SDC составляет 16 ГБ, а функция возвращает мне что-то вроде 2,22 ГБ. Что может быть не так, поскольку алгоритм и все остальное точно так же?

На данный момент у меня есть только одно подозрение, что проблема в SD-карте, Kingston 16 Gb Micro SDHC Class 4, которая точно соответствует другой, успешной, за исключением размера. Но я не знаю точно, с какой проблемой это может иметь место, поскольку она отлично работает для всего остального (копирование, вставка, создание папок и т. Д.). Между прочим, форматирование одинаково для обеих карт памяти, и у меня больше не осталось никаких дополнительных тестов.

Так кто-нибудь знает, что может происходить? имеет statvfs какое-то ограничение, о котором не говорят документы? Должен ли я изменить функцию?

2

Решение

32-битный тип данных может содержать размеры не более 4G, в то время как для представления 16G вам нужно больше битов, поэтому необходимо использовать 64-битный тип данных. Попробуйте использовать quint64 вместо того, что вы используете сейчас, или проверьте, какой собственный 64-разрядный тип данных без знака поддерживает ваш компилятор. Это обычно без знака long long.

1

Другие решения


По вопросам рекламы [email protected]