arduino - 如何使用 SdFat 从 SD 卡中删除最旧的文件
问题描述
我正在尝试使用 SdFat 从 sd 卡中删除最旧的文件,但没有成功
我在 Arduino 论坛上发现了这个 功能
void deleteOldestFile(){
SdFile dirFile;
SdFile file;
SdFile oldestFile;
dir_t dir;
uint32_t oldestModified = 0xFFFFFFFF;
uint32_t lastModified;
if (!dirFile.open("/", O_READ)) {
sd.errorHalt("open root failed");
}
while (file.openNext(&dirFile, O_WRITE)) {
// Skip directories and hidden files.
if (!file.isSubDir() && !file.isHidden()) {
file.dirEntry(&dir);
lastModified = (uint16_t (dir.lastWriteDate) << 16 | dir.lastWriteTime);
if (lastModified < oldestModified ) {
oldestModified = lastModified;
oldestFile = file;
}
}
file.close();
}
if(!oldestFile.remove()) Serial.println("failed");
dirFile.close();
}
但是当这个函数运行任何想法为什么以及如何解决这个问题时,我会收到一条“失败”消息?
编辑:我可以像这样使用删除:
char delChar[13] = {0};
...
Serial.print("oldest: ");
oldestFile.printName();
oldestFile.getName(delChar,13);
Serial.println();
Serial.print("delchar: ");
Serial.println(delChar);
if(!sd.remove(delChar)) Serial.println("fail");
dirFile.close();
但file.remove()
仍然无法正常工作
解决方案
我在代码中看到一个错误,这将导致查找最旧文件时出现问题。这不是 file.remove() 问题的主要原因,但是一旦你找到并修复了 file.remove() 问题,它就会造成麻烦。
lastModified = (uint16_t (dir.lastWriteDate) << 16 | dir.lastWriteTime);
那个 uint16_t 应该是 uint32_t 。该错误将导致文件的 lastWriteDate 被视为零,因为将无符号 16 位数字向左移动 16 位会导致结果为零。
这是一个草图来说明这个问题:
/*
* Simple Arduino Uno Sketch to show a bug and its corrected code.
*/
uint32_t oldestModified = 0xFFFFFFFF; // Tip: use 0xFFFFFFFFul to be unambiguous
uint16_t lastWriteDate = 5; // an arbitrary date
uint16_t lastWriteTime = 3; // an arbitrary time
void setup() {
uint32_t badLastModified;
uint32_t lastModified;
Serial.begin(9600);
delay(4000); // to give the user a chance to open the serial monitor.
Serial.print("oldestModified = 0x");
Serial.println(oldestModified, HEX);
badLastModified = (uint16_t (lastWriteDate) << 16 | lastWriteTime); // original
lastModified = (uint32_t (lastWriteDate) << 16 | lastWriteTime); // corrected
Serial.println();
Serial.print("badLastModified = 0x");
Serial.println(badLastModified, HEX);
Serial.print("lastModified = 0x");
Serial.println(lastModified, HEX);
}
void loop() {
}
在 Arduino Uno 上运行此 Sketch 会产生以下输出:
oldestModified = 0xFFFFFFFF
badLastModified = 0x3
lastModified = 0x50003
推荐阅读
- android - 用户在 android 应用程序中创建多个答案问题
- sql - 查询创建视图
- python - 切片字符串直到下一个字符
- python - 从两个列表中找到最佳组合
- java - 类文件有错误的版本 57.0,应该是 55.0
- reactjs - React 是否会发送其整个公共目录内容?
- php - 我可以使用 swift 将 html 类型设置为邮件主题吗?
- kibana - 将时间范围从 Kibana 变为无痛脚本领域
- python - 如何将 Django-Filter 与 Django-Taggit 一起使用(按标签过滤帖子)?
- python - Python BeautifulSoup 通过实时价格循环