Как **получить** атрибуты для файлов SD?

Чтобы иметь возможность установить дату и время файлов на моей SD-карте, я последовал этому ответу: https://arduino.stackexchange.com/a/39127 /49678

Теперь мне интересно, Как мне считать значения в микроконтроллере? Чтобы внести ясность: я получаю правильные временные метки, когда вынимаю SD-карту и просматриваю их на ПК, но я также хочу иметь возможность прочитать их на микроконтроллере.

Внутри SdFile.cpp в строке 1025 есть функция timestamp, которая используется для установки временной метки, но я не могу найти какую-либо функцию для ее чтения. https://github.com/adafruit/SD/blob/master/utility/SdFile.cpp

Я бы предпочел решение, при котором мне не придется добавлять его в библиотеку самостоятельно.

Основная проблема, с которой я столкнулся, заключается в том, что я хочу регистрировать файлы, и как только память заполнится, я должен удалить самые старые файлы.

, 👍0

Обсуждение

Есть две библиотеки. Стандартная SD-библиотека Arduino и библиотека SdFat Билла Греймана (https://github.com/adafruit/SD/blob/master/utility/SdFile.cpp), остальные — копии, иногда с некоторыми дополнениями. Даже SD-библиотека Arduino изначально была написана Биллом Грейманом. Пример обратного вызова находится здесь: https://github.com/greiman/SdFat/blob/master/examples/Timestamp/Timestamp.ino Пример печати даты находится здесь: https://github.com/greiman/ SdFat/blob/master/src/FatLib/FatFilePrint.cpp Всего этого можно избежать и поместить дату и время в имя файла., @Jot


2 ответа


Лучший ответ:

2

В файловой системе FAT метки времени и другие атрибуты хранятся в каталоге, а не в файле. Поэтому вам нужно прочитать «файл», то есть каталог, содержащий интересующий вас файл.

Этот «файл» содержит записи в заранее определенной структуре. Чтение каждого блока данных с использованием этой структуры по очереди дает вам информацию для каждого файла.

Вы можете просто выполнить обычный вызов SD.open(...), чтобы открыть каталог, содержащий ваш файл, а затем прочитать из него фрагменты данных, чтобы получить каждую запись файла.

р>

Эти данные расположены в структуре directoryEntry (здесь), поэтому чтение блока данных с помощью File.read(...) в переменную этого типа структуры даст ваши данные:

struct directoryEntry dirent;

// myDir уже открыт и указывает на начало вашего каталога
while (myDir.read((uint8_t *)&dirent, sizeof(struct directoryEntry))) {

    // Имена сложно печатать. Также вам следует проверить наличие удаленных файлов здесь.
    Serial.print("Name: ");
    for (int i = 0; i < 11; i++) {
        Serial.print(dirent.name[i]);
        if (i == 7) {
            Serial.print(".");
        }
    }
    Serial.println();
    Serial.print("Creation Time: ");
    Serial.println(dirent.creationTime);
    Serial.print("Creation Date: ");
    Serial.println(dirent.creationDate);
}
,

2

Вам необходимо получить объект SdFile для вашего файла, а затем использовать метод SdFile::dirEntry, чтобы получить запись каталога для файла.

Запись каталога (structdirectoryEntry) имеет временные метки.

,

Подскажите пожалуйста, что это для библиотеки SdFat. Пример для dirEntry тот же, что я дал: https://github.com/greiman/SdFat/blob/master/examples/Timestamp/Timestamp.ino, @Jot

@Jot, библиотека SD — это библиотека SdFat, упрощенная с помощью реализации Stream. должна быть возможность использовать часть SdFat для доступа к временной метке, @Juraj

Спасибо за ваш ответ, однако я не знаю, как это сделать. Как мне получить объект SdFile? Единственная функция, которую я могу найти, которая возвращает SdFile в SDClass: SdFile SDClass::getParentDir(const char *filepath, int *index), @Heneer