Определение количества записанных файлов на sd карту

Тема в разделе "Arduino & Shields", создана пользователем vvr, 25 дек 2015.

  1. vvr

    vvr Инженерище

    Продолжаю игрища с sd картой.
    Если при записи данных в файл можно узнать его размер и есть функции для чтения выборочных данных, можно читать с начала и с конца, то для работы с несколькими файлами полный ступор.
    Может кто то сталкивался как можно определить сколько файлов записано на карту и как их можно перебирать?
     
  2. AlexVS

    AlexVS Гик

    Все достаточно просто, но НЕ слишком изящно, нужно просто тупо в цикле вычитывать имена файлов. Следующий код выводит содержимое флэшки на вебстраницу.
    Код (C++):
    // вывод имен .csv файлов на веб-страницу в отсортированом виде
    void PrintSortFileName(File dir)
    {
      TimeElements te;
      String fname;
      char ff[9]="\0";
      char filename[100][9];
      long fsize[100];
      long OneDay = (60L * 60L * 24L);  // 1 день
      int i=0;                          // счетчик файлов
      //  сканируем SDшку //
      while (true)
      {
        File entry =  dir.openNextFile();
        if (! entry) {dir.rewindDirectory();break;} // no more files
        fname = entry.name();
        if ((fname.indexOf(".CSV") > 0)) //|| (fname.indexOf(".csv") > 0)
        {
          fname.toCharArray(ff,9);          //имя файла
          if (i < 100) //т.к. массив на 100 элементов
          {
            memcpy(&filename[i][0], ff, 9);   //заносим в массив
            fsize[i] = entry.size();          //размер файла
          }
          i++;
        }
        entry.close();
      }
      //перебираем даты от сегодня и назад
      for (long j = 0; j < i; j++)
      {
        time_t d =  now() - (OneDay * j);
        breakTime(d, te);
        fname = String(te.Year + 1970); // на основе даты формируем имя файла
        fname += TwoDigit(te.Month);
        fname += TwoDigit(te.Day);
        fname += ".CSV";
        fname.toCharArray(ff,9);
        //ищем в массиве с файлами соответствующее имя
        //т.к. массив на 100 элементов, счетчик задаем = 100
        // если файл старше 100 дней - хер на него
        for (int k = 0; k < 100; k++)
        {
          if (!strncmp(&filename[k][0],ff,9))   //если имя совпало - выводим его
          {    
            wclient.println(F("<li><a href='"));
            wclient.println(fname);
            wclient.println(F("' target='_blank'>"));
            wclient.println(fname);
            wclient.println(F("</a>"));
            wclient.println(F("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp"));
            wclient.println(fsize[k], DEC);
            wclient.println(F("</li>"));
            break;
          }
        }
      }
    }
    У меня файлы имеют имя типа: 20151221.csv. Так как нет никакой возможности отсортировать файлы я использовал два прохода. В первом я заполняю массив именами файлов, а во втором я иду от сегодня взад на 100 дней и выбираю имена уже из массива. Если соответствующее имя найдено, то вывожу его на веб-страницу.
     
    vvr нравится это.
  3. vvr

    vvr Инженерище

    спасибо за пример!
    буду разбираться