Подсчет числа файлов на карте SD

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Разбираю пример из библиотеки SD listfiles, чтобы написать свою функцию, которая подсчитывает число файлов на карте (без рекурсии, т.е. вложенных папок нет) ... вопрос, что значит:

File _root = SD.open("/");

Разве обратный слэш может быть именем файла? 

 

Araris
Offline
Зарегистрирован: 09.11.2012

Может быть именем каталога(директории).

Вот здесь http://wikihandbk.com/wiki/Arduino:Библиотеки/SD/Класс_SD/open() пишут :

Синтаксис

SD.open(filename)
SD.open(filename, mode)

Параметры

filename – название файла, который нужно открыть. Кроме того, можно открывать директории, 
​но для этого нужно использовать слэши (то есть «/»). Тип данных – char
mode (опционально) – режим открытия файла (по умолчанию – FILE_READ):
FILE_READ – открывает файл для считывания (начиная с начала файла)
FILE_WRITE – открывает файл для считывания и записи (начиная с конца файла)

 

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Хорошо, значит _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;   
}

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

А внутри цикла не должно быть тоже _entry = _root.openNextFile();

​вместо _entry.openNextFile();

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

kalapanga пишет:

А внутри цикла не должно быть тоже _entry = _root.openNextFile();

​вместо _entry.openNextFile();

Если заменить, как вы говорите, то цикл бесконечен ...

Araris
Offline
Зарегистрирован: 09.11.2012

Взгляните на http://wikihandbk.com/wiki/Arduino:Примеры/List_Files - даже с рекурсией (с подкаталогами)

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Araris пишет:

Взгляните на http://wikihandbk.com/wiki/Arduino:Примеры/List_Files - даже с рекурсией (с подкаталогами)

Ссылку, которую вы дали, в точности повторяет пример из библиотеки SD, который у меня вначале не работал ... после танцев с бубнами, выяснилось, что проблема в моем коде, я исправил и пример заработал, но есть одно маленькое но ... запуск рутины void printDirectory(File dir, int numTabs) из примера я запускаю не в setup, а в loop, но она упорно возвращает результат числа файлов только один раз, пока не пойму, в чем дело

negavoid
Offline
Зарегистрирован: 09.07.2016

Потому что root.close(); забыли, после чего можно снова сделать .open() и считать файлы.

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011
/************************ Функция подсчитывает число файлов на карте 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;   
}

negavoid пишет:

Потому что root.close(); забыли, после чего можно снова сделать .open() и считать файлы.

Сделал я открытие и закрытие, но увы ... функция вызывается в loop и правильное значение возвращает только раз, затем возвращает 0

 

 

polkitavr
Offline
Зарегистрирован: 23.06.2020

Вы должны переходить на первый файл в директории. Вот этой функцией rewindDirectory(). Там где выход из while там и эта функция.

Выход это Break;

b707
Offline
Зарегистрирован: 26.05.2017

polkitavr - обращайте внимание на даты сообщений, на которые отвечаете