statvfs 无法正确识别文件夹大小

statvfs failing to properly recognize the folder size

我有一个嵌入式 Linux 系统,它根据请求开始在 SD 卡中记录一些数据。控制系统的软件有一个定期调用的函数来检查 SD 卡中的可用数量 space,如果占用达到 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.2Gb。我也用这个功能知道还剩多少录音时间。

该算法首先在 4 Gb SD 卡中进行了测试,并且运行良好。此 SDC 分为两个分区,相关分区称为 /media/mmcblk0p2/。我面临的问题是,当 运行 在另一个具有不同 SD 卡的系统中使用确切的代码时,文件夹大小的返回值是错误的:SDC 是 16 Gb,函数返回类似 2.22 的值Gb。算法和其他一切都完全一样,这有什么问题吗?

我现在唯一的怀疑是 SD 卡有问题,金士顿 16 Gb micro sdhc Class 4 与另一个完全相同,成功的,除了大小.但我不知道它可能有什么问题,因为它对其他一切都很好(复制、粘贴、创建文件夹等)。顺便说一句,两张存储卡的格式是一样的,我没有其他东西可以 运行 进行一些额外的测试。

那么有人知道可能发生的事情吗? statvfs 是否存在文档未提及的某种限制?我应该改变功能吗?

32位的数据类型最多可以容纳4G的大小,而要表示16G则需要更多的位,所以必须使用64位的数据类型。尝试使用 quint64 而不是您现在使用的,或者检查您的编译器支持的原生无符号 64 位数据类型。它通常是 unsigned long long。