首页 > 解决方案 > 如何使用 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()仍然无法正常工作

标签: arduinosd-cardarduino-c++

解决方案


我在代码中看到一个错误,这将导致查找最旧文件时出现问题。这不是 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

推荐阅读