Как **получить** атрибуты для файлов SD?
Чтобы иметь возможность установить дату и время файлов на моей SD-карте, я последовал этому ответу: https://arduino.stackexchange.com/a/39127 /49678
Теперь мне интересно, Как мне считать значения в микроконтроллере? Чтобы внести ясность: я получаю правильные временные метки, когда вынимаю SD-карту и просматриваю их на ПК, но я также хочу иметь возможность прочитать их на микроконтроллере.
Внутри SdFile.cpp в строке 1025 есть функция timestamp, которая используется для установки временной метки, но я не могу найти какую-либо функцию для ее чтения. https://github.com/adafruit/SD/blob/master/utility/SdFile.cpp
Я бы предпочел решение, при котором мне не придется добавлять его в библиотеку самостоятельно.
Основная проблема, с которой я столкнулся, заключается в том, что я хочу регистрировать файлы, и как только память заполнится, я должен удалить самые старые файлы.
@Heneer, 👍0
Обсуждение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);
}
Вам необходимо получить объект 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
- SD - карта создает "лишний" файл?
- Возврат в родительский каталог с библиотекой SD
- Режимы открытия файлов на SD-карте Arduino добавление/перезапись
- Сохранение файла .txt на SD-карту и чтение данных каждого содержимого в файл txt, а затем сохранение его в переменной
- Использование SD-адаптера 5 В в системе 3,3 В
- Редактирование определенной позиции в файле, хранящемся на SD-карте
- Проблема с открытием нескольких текстовых файлов одновременно/по порядку с использованием <SD.h>
- Arduino SD подсчитывает файлы и открывает их последним, как это сделать?
Есть две библиотеки. Стандартная 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