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

时间:2015-06-15 12:02:10

标签: c++ linux sd-card filesize

我有一个嵌入式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 Gb。我也使用这个功能来了解剩余的录音时间。

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

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

那么有人对可能发生的事情有所了解吗? statvfs文档没有谈到某种限制吗?我应该更改功能吗?

1 个答案:

答案 0 :(得分:1)

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