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。
我有一个嵌入式 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。