Controllare se esiste un file su SD con nome String

Hola

Non riesco a trovare spiegazioni su come fare.

Devo controllare se esiste un file su SD, indicando come nome del file una stringa di testo, tipo cosi:

String nomefile="Dati_volo ";
String file(nomefile + (numfile));
if (SD.exists(String(file))
{
bla bla bla..
}

La forma giusta quale sarebbe?

Premesso che sempre e comunque mi vedrai [u]sconsigliare[/u] l'uso della classe String su MCU piccole come un 328P, e consigliare invece di imparare ad usare le classiche stringhe del C, comunque ... non capisco la tua domanda ...

... per il test, come tu stesso indichi, devi usare il metodo exists() della classe SD, quindi ... cosa vuoi esattamente sapere ?

Guglielmo

il suo problema probabilmente è che non riesce a far funzionare quel pezzo di codice perchè non ha letto la libreria alla funzione exist(). Il nome del file non è una stringa ma un array di char

String str = "nomedelfile"; 
int str_len = str.length() + 1;  //trovo la lunghezza della stringa che mi serve per creare l'array
char char_array[str_len]; // creo l'array 
str.toCharArray(char_array, str_len); //trasferisco i caratteri della stringa nell'array

ora char_array sarà il nome del fine

ciao

pablos: Il nome del file non è una stringa ma un array di char

XD XD XD XD ... quindi, senza saperlo, il mio consiglio iniziale era quello giusto !!!

Però Pablos ... guardando il metodo exists() non trovo traccia che filename sia una classica stringa, anzi ... non trovo traccia di che tipo sia ... dove lo dice ? :astonished:

Guglielmo

EDIT : OK, trovato, però tocca andare a leggere i sorgenti della libreria, nel reference non lo trovo :

// Methods to determine if the requested file path exists.
boolean exists(char *filepath);
File SDClass::open(const char *filepath, uint8_t mode) {
 boolean exists = (*p_child).open(*p_parent, buffer, O_RDONLY);

comunque ci ho battuto la testa anch'io su sta cosa, quando volevo da web passare il nome del file alla lib SD e mi intestardivo a passare una stringa :)

Appunto, stai mostrandomi quello che ho messo io nel EDIT del mio post ... ... pezzi di codice ... di una libreria interna al IDE ! :astonished:

Onestamente mi aspetto che queste indicazioni sul tipo di dati [u]siano riportate nei "references"[/u] e non che uno sia obbligato ad andarsi a spulciare il codice !

Per te e per me non è un problema, ma per uno che inizia ... :roll_eyes:

Guglielmo

P.S. : comunque a me non sarebbe mai capitato, per me la classe String NON esiste !!! :grin: :grin: :grin:

Si purtroppo quando non capisco qualcosa mi tocca spulciare le lib e se ce ne sono decine collegate ci metto ore a trovare i percorsi, poi suona il telefono e devo ricominciare da capo ahahahahhahaha

Grazie delle risposte. Sinceramente ci ho capito poco pero.

Pensavo che andasse bene una stringa perche come dicevate voi nel reference di SD.exists() non mi dice che filename dev'essere un testo e basta, anzi, le virgolette " " non ci sono quindi penso che sia una variabile

In pratica voglio: controllare se esiste il file "nomefile" + (numerofile) se esiste --> numerofile=numerofile + 1 controlla se esiste il file "nomefile" + (numerofile) Se non esiste crealo e scrivici dentro...

Ho piu o meno "capito" questo:

pablos: String str = "nomedelfile"; int str_len = str.length() + 1;  //trovo la lunghezza della stringa che mi serve per creare l'array char char_array[str_len]; // creo l'array str.toCharArray(char_array, str_len); //trasferisco i caratteri della stringa nell'array

ora char_array sarà il nome del fine

Ma come ci aggiungo la numerazione del file? questo all'inizio? String str = String ("nomefile"+(numerofile);

Possibile che per fare un'operazione cosi comune non ci sia un modo meno macchinoso?

Certo che c’è … è che bisogna … studiare il C e le sue librerie :grin: :grin: :grin:

Allora, come ti ho detto ti sconsiglio comunque caldamente di usare la classe String … magari tu vieni da PC e da ambienti dove è normale il suo uso, qui sei su una piccola MCU che ha poca SRAM, che NON ha un OS e che NON ha un “garbage collector” il che significa che … ci metti meno di un attimo a frammentare tutta la SRAM e a perdere il controllo del programma, poi … fai come vuoi … :roll_eyes:

Il mio consiglio è invece che ti impari ad usare gli array di char, ovvero le stringhe del C e le funzioni che ti permettono di manipolarle e che trovi in AVR libc, libreria automaticamente inclusa. In particolare, per quello che devi fare tu basta usare le funzioni definite in <string.h> e nella <stdlib.h> :wink:

Venendo alla pratica …
… si comincia con dichiarare l’array che conterrà la stringa, un campo con il numero file ed uno con il suo valore come stringa:

char nomeFile[13];  // 8.3 caratteri + terminatore di stringa 0x00
char sNumFile[4];   // 3 caratteri + terminatore di stringa 0x00
byte numFile = 1;   // valore numerico del numero file 0..255

nel codice poi componi la stringa :

strcpy(nomeFile, "NOME");    // metti "NOME" nel nomeFile
itoa(numFile, sNumFile, 10); // converti il numero del file in stringa usando la base decimale (10)
strcat(nomeFile, sNumFile);  // appendi al nomeFile ("NOME") il numero ("1", "2", ...)
strcat(nomeFile, ".TXT");    // e appendi il classico ".TXT" alla fine del file
if ( SD.exists(nomeFile) ) { .... }

… come vedi nulla di trascendentale … basta conoscere il C e le sue funzioni :wink:

Guglielmo

Ok, grazie. Sei un angelo!

In realtà io non vengo da nessuna parte, nel senso che da ragazzino "giocavo col Basic, da più grandicello giocavo con l'HTML e poi basta. Il resto della mia esperienza è il manuale dello starter kit e quello che ci capisco del Reference.

Mi studierò meglio il tuo metodo.

Grazie!

Figurati ... :)

Se hai difficoltà ... chiedi ;)

Guglielmo