GR-Peachでは普段プログラムを作らないのですが,まれに頼まれて作っているWakarancheeです。
https://www.renesas.com/jp/ja/products/gadget-renesas/reference/gr-peach/library-sdmmc
上記を見てSD.remove()を使ってファイルを消去したいのですが,簡単にはできそうもありません。
私が担当しているプログラムでは,SDカード上に常時記録を取っていて,定期的にファイル名を
変更して書き加えていきます。SDカードの容量が満杯になる前に,古いファイルを消して
行きたいのですが,ファイル名がそのファイルを書き始めた時刻になっているので,正確な
ファイル名を知ることができません。
SD.remove()では正確なファイル名が必要なようです。
ディレクトリについては正確に分かるので,ディレクトリごと消去しようと思い,SD.rmdir()を
やってみましたが「false」で返ってきて消去できません。
ディレクトリを読んでファイル名を特定しようとも思いますが,読み方が分かりません。
特定のディレクトリ(名前は分かっている)下のファイルを丸ごと消す方法で良いので,
簡単に消す方法はありませんでしょうか。
Wakarancheeさん、こんにちは。NoMaYと申します。> ディレクトリについては正確に分かるので,ディレクトリごと消去しようと思い,SD.rmdir()をやってみましたが「false」で返ってきて消去できません。これは、いにしえのMS-DOSと同様に(あるいはWindowsのコマンドプロンプトと同様に)ディレクトリ下が空では無いから消去出来ないのではないかと思います。そして、APIとしては、空では無いディレクトリ下のファイルを丸ごと消去するAPIは無さそうです。> ディレクトリを読んでファイル名を特定しようとも思いますが,読み方が分かりません。いにしえのMS-DOSのAPIの使い方からの推測ですけれども、以下のAPIを組み合わせて、ディレクトリ下のファイルの一覧をリストアップしていくものなのではないかと思います。www.renesas.com/jp/ja/products/gadget-renesas/reference/gr-peach/library-sdmmcfile「rewindDirectory概要 ディレクトリの最初に戻します。openNextFile()と組み合わせて使われます。文法 file.rewindDirectory()パラメータ なし戻り値 なし 」「openNextFile概要 ディレクトリ内の、次のファイルかフォルダを返します。文法 file.openNextFile()パラメータ なし戻り値 該当するディレクトリ内の次のファイルかフォルダー。 」なお、ディレクトリ下にディレクトリとファイルが混在している場合は以下のAPIも併用するのではないかと思います「isDirectory概要 開いているファイルオブジェクトが、ファイルかディレクトリか調べます。文法 file.isDirectory()パラメータ なし戻り値 ディレクトリならtrue、ファイルならfalseを返します。 」[関連リンク]具体的なサンプルがありますね。Google検索: Arduino API SD openNextFilewww.google.com/search?q=Arduino+API+SD+openNextFileArduinoリファレンス Arduinoリファレンスの日本語訳のページです - garretlabトップ > Arduinoリファレンス > ライブラリリファレンス > 標準ライブラリ > SD > FileFile::openNextFile()garretlab.web.fc2.com/arduino_reference/libraries/standard_libraries/SD/File/openNextFile.htmlArduino Reference - 本家Reference > Libraries > Sd > OpennextfileSD - openNextFile()www.arduino.cc/reference/en/libraries/sd/opennextfile/
NoMaYさん,ありがとうございます。
やっぱり書いてある例を使うしかなさそうですか。
私のプログラムでは「entry.name()」のreturn値がなしで
返ってきます。ファイルが無いように見えます。
ディレクトリファイルをread()して無理やりみてみると
ファイル名が入っています。これを使おうかとも
思いますが,ディレクトリ中に連続に入っている保証が
あるのかどうかもわからないので乱暴かなとも思っています。
Wakarancheeさん、こんにちは。NoMaYです。> 私のプログラムでは「entry.name()」のreturn値がなしで返ってきます。ファイルが無いように見えます。ということは、本家のArduino Referenceのサンプルプログラムでも動作しない、ということですか?サンプルプログラムの以下の部分も動作しない、ということでしょうか?
void printDirectory(File dir, int numTabs) { while (true) { File entry = dir.openNextFile(); if (!entry) { if (numTabs == 0) Serial.println("** Done **"); return; } for (uint8_t i = 0; i < numTabs; i++) Serial.print('\t'); Serial.print(entry.name()); if (entry.isDirectory()) { Serial.println("/"); printDirectory(entry, numTabs + 1); } else { Serial.print("\t\t"); Serial.println(entry.size(), DEC); } entry.close(); }}
ご指摘,ありがとうございます。
プログラム見直してみたら間違っていて,entry.name()のreturn値にファイル名が入ってきました。name()でもって一つづつファイル名を読んで消していき,最後にディレクトリを消すということで無事消すことができました。
ディレクトリファイルを読むときにopenしていたのに,name()を使う前にclose()してしまっていたのが原因でした。