

開発環境はArduinoです。

以下のようなプログラムを実行させましたが、 `rewindDirectory()` 実行後、2度目のファイル名取得をスルーしました。  
なにか間違えていますでしょうか？  
或いは、SDカードに依存した現象でしょうか？  
ご教示ください。

また、認識できたファイル数が9個まで（実際は13個のファイルが存在する）となります。  
ファイル数に制限がありますか？

[code]

    //For SPRESENSE
    #include <SDHCI.h>
    SDClass SD;
    const uint8_t cs_SD = 5;
    
    char Mp3Name[128];
    
    File theSD;
    File entry;
    File root;
    void setup()
    {
    int nk = 0;
    Serial.begin(115200);
    SD.begin();
    
    // SDカードのファイル名取得の実験
    root = SD.open("/");
    while (true)
    {
    entry = root.openNextFile();
    if (!entry)
    {
    //これ以上ファイルがない場合
    root.rewindDirectory();
    usleep(40000);
    break;
    }
    
        //ディレクトリ名ではない場合
        if (!entry.isDirectory()) 
        {
            String fileName = entry.name();
            strcpy(Mp3Name, &fileName[0]);
            nk++;
            printf("[%02d] %s\n", nk, Mp3Name);
        }
    }
    nk = 0;
    while (true) 
    {
        entry = root.openNextFile();
        if (!entry)
        {
            //これ以上ファイルがない場合
            root.rewindDirectory();
            usleep(40000);
            break;
        }
    
        //ディレクトリ名ではない場合
        if (!entry.isDirectory()) 
        {
            String fileName = entry.name();
            strcpy(Mp3Name, &fileName[0]);
            nk++;
            printf("[%02d] %s\n", nk, Mp3Name);
        }
    }
    printf("SetupEnd\n");
    
    }
    
    void loop() {
    // put your main code here, to run repeatedly:
    
    }
    
[/code]


CC BY-SA 4.0
2020-09-08T02:11:46.307
70216
2020-09-10T07:25:37.173
2020-09-08T03:31:33.127
3068
41809
question
spresense
rewindDirectory()を実行してもファイルが先頭に戻らない。


同じ問題にハマったことがあります。

`File entry = dir.openNextFile();` の最後に、`entry.close();`
でファイルをクローズすれば動くと思います。きっと open できるファイル数の上限か何かに引っ掛かっているのだと思います（予想）

SDHCIのサンプルスケッチ UsbMscAndFileOperation.ino はどうして動くんだろうと思って差分を眺めていて気がつきました。

試してみてください。

[code]

    //For SPRESENSE
    #include <SDHCI.h>
    SDClass SD;
    const uint8_t cs_SD = 5;
    
    char Mp3Name[128];
    
    File theSD;
    File entry;
    File root;
    void setup()
    {
      int nk = 0;
      Serial.begin(115200);
      SD.begin();
    
      // SDカードのファイル名取得の実験
      root = SD.open("/");
      while (true)
        {
          entry = root.openNextFile();
          if (!entry)
            {
              //これ以上ファイルがない場合
              root.rewindDirectory();
              usleep(40000);
              break;
            }
    
          //ディレクトリ名ではない場合
          if (!entry.isDirectory())
            {
              String fileName = entry.name();
              strcpy(Mp3Name, &fileName[0]);
              nk++;
              printf("[%02d] %s\n", nk, Mp3Name);
            }
          entry.close(); // ★★追加★★
        }
      nk = 0;
      while (true)
        {
          entry = root.openNextFile();
          if (!entry)
            {
              //これ以上ファイルがない場合
              root.rewindDirectory();
              usleep(40000);
              break;
            }
    
          //ディレクトリ名ではない場合
          if (!entry.isDirectory())
            {
              String fileName = entry.name();
              strcpy(Mp3Name, &fileName[0]);
              nk++;
              printf("[%02d] %s\n", nk, Mp3Name);
            }
          entry.close(); // ★★追加★★
        }
      printf("SetupEnd\n");
    
    }
    
    void loop() {
    // put your main code here, to run repeatedly:
    
    }
    
[/code]


CC BY-SA 4.0
2020-09-08T18:12:11.100
70236
2020-09-10T07:25:37.173
2020-09-10T07:25:37.173
32986
31378
70216
answer