Подсчет числа файлов на карте SD
- Войдите на сайт для отправки комментариев
Втр, 09/05/2017 - 19:15
Разбираю пример из библиотеки SD listfiles, чтобы написать свою функцию, которая подсчитывает число файлов на карте (без рекурсии, т.е. вложенных папок нет) ... вопрос, что значит:
File _root = SD.open("/");
Разве обратный слэш может быть именем файла?
Может быть именем каталога(директории).
Вот здесь http://wikihandbk.com/wiki/Arduino:Библиотеки/SD/Класс_SD/open() пишут :
Синтаксис
Параметры
Хорошо, значит _root - мы открыли директорию? И как теперь подсчитать число файлов? У меня что-то ноль все время возвращает:
/************************ Функция подсчитывает число файлов на карте SD и их суммарный объем **********************/ // p = 0; - число файлов // p = 1; - суммарный объем файлов // int fnFileNumSD(int p) { // пока игнорируем параметр p int i = 0; // Перемещаемся в корневую директорию File _root = SD.open("/"); // Открываем первый файл в этой директории File _entry = _root.openNextFile(); while(_entry) { i++; _entry.openNextFile(); Serial.print("file name = "); Serial.println(_entry.name()); } _root.close(); _entry.close(); return i; }А внутри цикла не должно быть тоже _entry = _root.openNextFile();
вместо _entry.openNextFile();
А внутри цикла не должно быть тоже _entry = _root.openNextFile();
вместо _entry.openNextFile();
Если заменить, как вы говорите, то цикл бесконечен ...
Взгляните на http://wikihandbk.com/wiki/Arduino:Примеры/List_Files - даже с рекурсией (с подкаталогами)
Взгляните на http://wikihandbk.com/wiki/Arduino:Примеры/List_Files - даже с рекурсией (с подкаталогами)
Ссылку, которую вы дали, в точности повторяет пример из библиотеки SD, который у меня вначале не работал ... после танцев с бубнами, выяснилось, что проблема в моем коде, я исправил и пример заработал, но есть одно маленькое но ... запуск рутины void printDirectory(File dir, int numTabs) из примера я запускаю не в setup, а в loop, но она упорно возвращает результат числа файлов только один раз, пока не пойму, в чем дело
Потому что root.close(); забыли, после чего можно снова сделать .open() и считать файлы.
/************************ Функция подсчитывает число файлов на карте SD и их суммарный объем **********************/ // p = 0; - возвращает число файлов // p = 1; - возвращает суммарный объем файлов // Переменные _root и _entry объявлены как глобальные // int fnFileNumSD(int p) { // пока игнорируем параметр p int i = 0; // Перемещение в корневую директорию выполнено в setup // _root = SD.open("/"); // Перемещаемся к первому файлу _entry = _root.openNextFile(); while(true) { _entry = _root.openNextFile(); if(!_entry) { break; } Serial.print("file name = "); Serial.println(_entry.name()); Serial.print("file size = "); Serial.println(_entry.size()); Serial.print("i = "); Serial.println(i); i++; } _root.close(); _entry.close(); // Снова вроде перемещаемся в корень _root = SD.open("/"); return i; }Потому что root.close(); забыли, после чего можно снова сделать .open() и считать файлы.
Сделал я открытие и закрытие, но увы ... функция вызывается в loop и правильное значение возвращает только раз, затем возвращает 0
Вы должны переходить на первый файл в директории. Вот этой функцией rewindDirectory(). Там где выход из while там и эта функция.
Выход это Break;
polkitavr - обращайте внимание на даты сообщений, на которые отвечаете