0

私の目標は、SD カードのファイル システムをナビゲートし、特定のファイル タイプを選択してユーザーに表示できるようにすることです。sd.ls(LS_R)SdFat ライブラリで実行すると、多くの隠しファイルが表示されます。私はそれらのほとんどにうまく対処できますが、それらのいくつかは私に頭痛を引き起こします. ライブラリは 8.3 命名規則を使用するため、長すぎるファイル/フォルダー名は切り捨てられ、"~" に置き換えられます。表示されているファイル/フォルダーと非表示のファイル/フォルダーを区別できないため、これは問題です。この問題を解決する既知の方法はありますか?

これが私のコードです:

#include <SdFat.h>

const uint8_t chipSelect = 10;

SdFat sd;
SdFile file;

void setup() 
{
    Serial.begin(9600);
    while (!Serial) {} // wait for Leonardo
    delay(1000);

    if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt();

    sd.ls(LS_R);
    while(1);
}

void loop() {}

これが私の「目に見える」ファイルシステムです:

Folder1/
    test3.txt
    test4.txt
Folder2/
BearsOutside/
test1.txt
test2.txt
LongFilename.txt

出力は次のとおりです。

FOLDER1/
  TEST4.TXT
  TEST3.TXT
TEST2.TXT
~1.TRA
TEST1.TXT
TRASHE~1/
SPOTLI~1/
  STORE-V2/
    F8D581~1/
      PSID.DB
      TM~1.SNO
      TM~1.LIO
      LIO~1.CRE
      TMP.CAB
      CA~1.CRE
      INDEXS~1
      ~1.IND
      ~~2.IND
      ~~~3.IND
      ~~~~4.IND
      ~~~~~5.IND
      ~~~~~~34.IND
      ~~~~~~37.IND
      ~~~~~~40.IND
      ~~~~~~43.IND
      ~~~~~~46.IND
      ~~~~~~48.IND
      ~1.DIR
      LIVE~~~4.IND
      LIVE~~2.IND
      LIVE~~~3.IND
      LIVE~~~5.IND
      LIVE~~66.IND
      LIVE~~69.IND
      LIVE~~73.IND
      LIVE~1.SHA
      LIVE~~79.IND
      LIVE~1.DIR
      LIVE0D~1.SHA
      STORE.DB
      STOR~1.DB
      REVERS~1
      TMPSPO~1.STA
      PERMST~1
      STORE_~1
      JOURNA~1.LIV/
      JOURNA~2.LIV/
        RETIRE.3
      JOURNA~3.LIV/
        RETIRE.4
      JOURNA~4.LIV/
      JOURNA~1.ASS/
      JOURNA~2.ASS/
      JOURNA~1.HEA/
      JOURNA~1.MIG/
      JOURNA~2.MIG/
      JOURNA~1
      JOURNA~1.SCA/
        RETIRE.11
      REVERS~1.SHA
      ~1.SHA
      SHUTDO~1
      JOURNA~1.REP/
      CA~1.MOD
      LIVE~155.IND
      LIVE~158.IND
      0DIREC~1.SHA
      ~~~~~166.SHA
      LIVE~169.IND
      LIVE~172.IND
      LIVE~175.IND
      LIVE~178.IND
      LIVE~181.IND
      LIVE~184.IND
      LIVE~1.IND
      LIVE~190.IND
      LIVE~194.SHA
      STOR~1.UPD
      REVERS~1.UPD
      LIVE~202.IND
      TMPSPO~1.LOC
      LIVE~208.IND
      LIVE~211.IND
      LIVE~215.IND
      LIVE~218.SHA
      LIVE~~2.DIR
      LIVE1D~1.SHA
      LIVE~264.SHA
      LIVE~267.IND
      LIVE~270.IND
      LIVE~274.IND
      LIVE~277.IND
      LIVE~~~3.DIR
      LIVE~~2.SHA
      LIVE~~~3.SHA
      LIVE~~~4.SHA
      LIVE~~~5.SHA
      LIVE~296.SHA
      LIVE~300.SHA
      LIVE2D~1.SHA
      LIVE~308.SHA
      LIVE~327.IND
  STORE-V1/
    VOLUME~1.PLI
  VOLUME~1.PLI
FOLDER2/
BEARSO~1/
LONGFI~1.TXT

BEARSO~1/だから私の問題は、非表示になっていない[BearsOutside]と、非表示になっている[BearsOutside]をどのように区別するのSPOTLI~1/ですか?

4

3 に答える 3

1

これらのファイルは、Mac OSX システムによって自動的に作成されます...どの Mac でも SD カードを差し込まないという選択肢はありますか? これで問題は解決します... ;-)

Mac のターミナルでそれらを削除することもできます。

于 2014-02-12T18:53:02.020 に答える
0

これは非常に古い質問ですが、Google 検索で上位に表示されるため、最新の情報を提供します。

この記事の執筆時点 (2020 年秋) では、SdFat へのメジャー アップグレードが存在します。SdFat-2.0 は数年前から利用可能であり、引き続き beta.8 としてラベル付けされていますが (ReadMe では「初期ベータ」と呼ばれています)、既知の問題は比較的少なく、多くの製品で使用されています。サイト。

最初は採用するのをためらっていましたが、必要な新機能がたくさんあるので、最終的に歯を食いしばって採用しました。統合が非常に簡単で、非常に安定していることが判明しました。

SdFat-2.0 には、ExFat ボリューム、長いファイル名、および SD カードへのノンブロッキング書き込みを保証するメカニズムを備えたファイル クラスターの事前割り当ての強力なサポートが含まれています。これにより、SD カードでのデータ ロギングを妨げていた長い書き込みレイテンシが時折ブロックされるという長年の問題が解決されます。ExFat ボリュームの場合、事前に割り当てられたファイル スペースの最終的な切り捨てのデータ サイズの計算は自動的に処理されます。

SdFat-2.0 は、異なるバスまたは異なるバス タイプで実行されている場合でも、複数のカードをサポートします。私は 3 枚の SD カードを備えたデバイスを持っており、1 枚は SDIO でアドレス指定され、2 枚は異なる SPI バスで実行されていますが、問題なくファイルをコピーできます。

私の知る限り、他の多くのライブラリが依存している古い arduino <sd.h> ライブラリとの非互換性は 2 つだけです。

SDFat-2.0 は の新しい構文を使用しbegin()、SD カードの配線方法とアドレス指定方法を示す構成オブジェクトを渡します。

file.name()SdFat-2.0 は8.3 ファイル名用に設定されているため、古い機能をサポートしていません。代わりに、ファイル名を保存できる場所を指す const char* を渡すことで、長いファイル名を取得します。ファイルを開くには完全なファイル名が必要ですが、8.3 のファイル名に固執しても問題ない場合は、単純なパラメーターなしの関数begin()と古いname()関数を実装するラッパーを作成できます。これにより、すべてが完全に互換性があり、ライブラリのパッチがsd.h回避されます。#ifdef

私が発見した唯一の互換性の問題であり、個人的にバグに遭遇したことはありません。ここで github プロジェクトを見つけることができます: github.com/greiman/SdFat-beta

于 2020-09-04T20:38:44.643 に答える