[Programmation] [arduino] comment isoler l'extension de noms de fichiers (SD)
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

[arduino] comment isoler l'extension de noms de fichiers (SD)



  1. #1
    invite397c0835

    [arduino] comment isoler l'extension de noms de fichiers (SD)


    ------

    Bonjour,

    Une carte SD, des fichiers et je voudrais n'ouvrir que les fichiers .TXT.
    Je sais le faire en utilisant un objet String pour le nom de fichier, mais c'est quand même un gros machin pour peu de choses
    Donc je pensais utiliser un tableau de caractères comme dans le code qui suit. L'extension est bien isolée, mais le test if (Ext=="TXT") ne fonctionne pas.
    Que fais-je de mal ?

    Merci !
    Code:
      
    #include <SPI.h>
    #include <SD.h>
    
    
    File root; // Dossier racine
    File Fichier;
    
    void setup() {
      Serial.begin(115200);
    
      Serial.print("Initializing SD card...");
    
      if (!SD.begin(4)) {
        Serial.println("initialization failed!");
        while (1);
      }
      Serial.println("initialization done.");
    
      root = SD.open("/");
    
    }
    
    void loop() {
      char F[14];
      char Nom[9];
      char Ext[4];
      char *p;
      int i;
    
      File entry =  root.openNextFile();
      if ( entry) {
        strcpy(F, entry.name());
        Serial.println(F);
        p = strtok(F, ".");
        strcpy(Nom, p);
        p = strtok(NULL, ".");
        strcpy(Ext, p);
        Serial.print(Nom);
        Serial.print(" ");
        Serial.println(Ext);
    
        if (Ext == "TXT") {
          Serial.println("Trouvé !");
        }
    
        delay(1000);
        entry.close();
      } else {
        root.rewindDirectory(); // on boucle
      }
    }

    -----

  2. #2
    thierry_cavalie

    Re : [arduino] comment isoler l'extension de noms de fichiers (SD)

    C'est effectivement assez compliqué d'isoler une extension de fichier, attention à la logique !

    Il y a longtemps que je ne code plus en C mais JavaScript et PHP, c'est à peu près pareil...

    Tout d'abord, l'extension est "case-sensitive" donc on ramène tout en Maj ou en min avec lower(file_name) par exemple.

    Ensuite, il peut y avoir plusieurs points dans la chaîne, donc le point devra être intégré à l'extension : Ext = ".txt".

    Enfin, l'extension est toujours en bout de chaîne, donc on utilisera quelque chose comme :

    if (right:4(lower(filename)) == ".ext")
    {
    actions
    }

    pour le test.

  3. #3
    thierry_cavalie

    Re : [arduino] comment isoler l'extension de noms de fichiers (SD)

    correctif

    if (right:4(lower(file_name)) == ".txt") // pas besoin de var pour l'extension
    {
    actions
    }

    On n'a que 5 min pour modifier un post, c'est stupide, on peut même plus aller pisser
    Dernière modification par thierry_cavalie ; 28/12/2019 à 22h21.

  4. #4
    Ikhar84
    Animateur Informatique

    Re : [arduino] comment isoler l'extension de noms de fichiers (SD)

    Cela ne risque pas de marcher avec le charab...pardon... pseudo C Arduino...

    RTFM : fonction substring

    On sait que l'on devrait trouver un point en 4e position avant la fin (à toi de tester si Arduino commence à 1 ou 0 pour les "index" des strings)...

    La fonction lenght renvoie la longueur de la chaine de caractère...

    Donc si on fait un substring de la chaine de caractères representant le nom du fichier à compter de la 4e position en partant de la fin, on devrait retrouver l'extension seule.

    Quelque chose du genre:
    Code:
    File entry = root.openNextFile();
    if (entry.name.substring(entry.name.lenght-4) == ".txt") {
        //jackpot...
    }
    À adapter avec ou sans le . pour le txt... et tester pour le -4 (ou -3, c'est les fêtes et je suis loin d'être frais là !)...

    Edit: c'est vrai que rien ne garantie la casse... en bas de la page concernant les String chez Arduino, il y a les fonctions utilisables, avec les toLowerCase et toUpperCase.

    Et juste au dessous, on a même les opérateurs applicables (dont la comparaison...♧ ).
    Dernière modification par gienas ; 29/12/2019 à 09h32. Motif: Ajouté le . avant le txt oublié
    J'ai glissé Chef !

  5. A voir en vidéo sur Futura
  6. #5
    Jack
    Modérateur

    Re : [arduino] comment isoler l'extension de noms de fichiers (SD)

    Citation Envoyé par Ikhar84 Voir le message
    Cela ne risque pas de marcher avec le charab...pardon... pseudo C Arduino...
    En fait, c'est du C++ expurgé de la librairie standard et auquel un main a été ajouté appellant les fonctions setup et loop, cette dernière dans une boucle infinie.

  7. #6
    invite397c0835

    Re : [arduino] comment isoler l'extension de noms de fichiers (SD)

    Bonsoir à tous,

    Merci de vous être penché sur mon problème et excusez mon délai de réponse.

    @thierry_cavalie, sur Arduino, les noms ne sont pas sensibles à la casse et utilisent le format FAT 8.3
    @Ikhar84, j'ai indiqué que je savais le faire avec l'objet String (et donc substring), mais c'est un gros machin qui consomme de la mémoire (et que je soupçonne de provoquer des dysfonctionnements).

    Bref, j'ai exploré le C (c'est pas ma spécialité) et j'ai trouvé de quoi me satisfaire avec if (strstr(F, ".TXT") > 0) :

    Code:
    void loop() {
      char F[14];
      File entry =  root.openNextFile();
      if ( entry) {
        strcpy(F, entry.name());
        Serial.println(F);
        if (strstr(F, ".TXT") > 0) {
          Serial.println("Trouvé !");
    
          delay(1000);
        }
        entry.close();
      } else {
        root.rewindDirectory(); // on boucle
      }
    }
    Merci encore à vous tous et bonne fin d'année !

  8. #7
    invitef86a6203

    Re : [arduino] comment isoler l'extension de noms de fichiers (SD)

    Code:
        p = strtok(F, ".");
        strcpy(Nom, p);
    Tu copie à partir du point , par exemple pour "nom.ext" ça sera ".ext" , drôle de nom...

    Code:
        p = strtok(NULL, ".");
        strcpy(Ext, p);
    Tu cherche un point dans une chaine pointeur NULL, à mon avis tu as un "NULL pointer assignment" en retour...


    Méthode pour faire fonctionner les méninges ! LOL

    //////////////////////////////////////////////////////////////////////////////
    char * strncpy ( char * destination, const char * source, size_t num );
    destination => Nom
    source => F
    size_t => différence du pointeur Nom et du pointeur de '.'
    /////////////////////////////////////////////////////////////////////////////

    Code:
     
       p = strtok(F, "."); // pointer le point s'il existe sinon retourne un pointeur NULL
       if (p != NULL )  { // différent de pointeur NULL donc p pointe 1 point
         strncpy(Nom, F, (size_t) (F- p-1) );  // pointeur de début de chaine - pointeur du '.' = longueur du nom
         Nom[ F - p-1 ]='\0'; //fin de chaine (strncpy ne met pas de fin de chaine il faut le mettre !)
         strcpy(Ext ,p + 1); // copie de l'extension 
       }
       else { // p=pointeur NULL donc pas de point
        strcpy(Nom, F); // pas de point  on copie tout
       strcpy(Ext,""); // pas d'extension
       }


    Autre méthode plus simple !

    Code:
     
       strcpy(Ext,""); // si pas d'extension
       strcpy(Nom,F);  // on copie le nom , pour raccourcir de l'extension après.
       p = strtok(Nom, "."); // pointer le point s'il existe sinon retourne un pointeur NULL
       if (p != NULL )  { // différent de pointeur NULL donc p pointe 1 point
         *p ='\0'; //fin de chaine *p pointe le "." mettre un 0 à la place
         strcpy(Ext ,p + 1); // copie de l'extension (+1 pour ne pas prendre le ".")
       }

Discussions similaires

  1. Recherche fichiers d'extension *.xxx
    Par invitec85fb8ec dans le forum Logiciel - Software - Open Source
    Réponses: 7
    Dernier message: 09/10/2017, 18h52
  2. Trouver les noms des fichiers???? Recuva
    Par invite7fbc4149 dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 02/04/2012, 19h23
  3. extension des fichiers gérer par MPLAB
    Par invitef228b26f dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 12/12/2008, 13h06
  4. raccourcir les noms de fichiers > à 128 caract.
    Par inviteae2a2db4 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 06/05/2005, 13h02
  5. fichiers avec extension type png
    Par invite7fbfc161 dans le forum Logiciel - Software - Open Source
    Réponses: 5
    Dernier message: 11/10/2004, 22h57
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...