У меня есть система 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
какое-то ограничение, о котором не говорят документы? Должен ли я изменить функцию?
32-битный тип данных может содержать размеры не более 4G, в то время как для представления 16G вам нужно больше битов, поэтому необходимо использовать 64-битный тип данных. Попробуйте использовать quint64 вместо того, что вы используете сейчас, или проверьте, какой собственный 64-разрядный тип данных без знака поддерживает ваш компилятор. Это обычно без знака long long.