Cette fonction me rend fou !

Bonjour à toutes et à tous,

J'ai écrit une fonction destinée à remplacer un ancien fichier par un nouveau. Cette fonction reconnaît le fichier à supprimer car il porte le même nom de jour, mais pas la même date.

Cette fonction marche pour certains jours (je ne les ai pas repérés) et d'autres pas. Par exemple, aujourd'hui le fichier à remplacer est /Fri-07-02-25.csv et le nouveau est /Fri-14-02-25.csv.

J'ai mis des Serial.print() un peu partout pour suivre ce qui se passe : à moment, le nom du fichier supprFch disparaît et donc n'est pas supprimé.

Je vous joins le code de cette fonction ainsi que le résultat obtenu dans le moniteur série.

const char * remplaceFchHisto() {
  const char* supprFch;
  strftime(nom_Fch, 24, "/%a-%d-%m-%y.csv", &timeinfo);
  Serial.print("Demandé : "); Serial.println(nom_Fch);
  File root = LittleFS.open("/");
  File file = root.openNextFile();
  bool vu = false;
  while(file) {
    if (strncmp(file.path(), nom_Fch, 4) == 0) {
      Serial.print("Vu : "); Serial.println(file.path());
      if (strncmp(file.path(), nom_Fch, 16) != 0) {
        supprFch = file.path();
        vu = true;
        Serial.print("A supprimer : "); Serial.println(file.path());
        Serial.print("A supprimer : "); Serial.println(supprFch);
      }
    }
    if (vu == true) {
      break;
    }
    else
      file = root.openNextFile();
  }
  file.close();
  Serial.print("Fichier à supprimer : "); Serial.println(supprFch);
  if (LittleFS.exists(supprFch)) {
    Serial.print("En attente de suppression : "); Serial.println(supprFch); // Le nom du fichier vient de disparaître !!
    if (LittleFS.remove(supprFch)) { // Suppression de l'ancien fichier
      Serial.print("Supprimé : "); Serial.println(supprFch);
    } else
      Serial.println("Pas supprimé !");
  }
  if (!LittleFS.exists(nom_Fch)) {
    file = LittleFS.open(nom_Fch, FILE_WRITE); // Création du nouveau fichier
    file.close();
    Serial.print("Ajoute : "); Serial.println(nom_Fch);
  }
  return nom_Fch;
}

et le résultat :

10:53:38.040 -> Demandé : /Fri-14-02-25.csv
10:53:38.072 -> Vu : /Fri-07-02-25.csv
10:53:38.072 -> A supprimer : /Fri-07-02-25.csv
10:53:38.072 -> A supprimer : /Fri-07-02-25.csv
10:53:38.072 -> Fichier à supprimer : /Fri-07-02-25.csv
10:53:38.072 -> En attente de suppression : 
10:53:38.104 -> Pas supprimé !
10:53:38.104 -> Listing directory: /
10:53:38.104 ->   FILE: Fri-07-02-25.csv	SIZE: 36635
10:53:38.104 ->   FILE: Fri-14-02-25.csv	SIZE: 2635
10:53:38.141 ->   FILE: Mon-10-02-25.csv	SIZE: 30501
10:53:38.141 ->   FILE: Sat-08-02-25.csv	SIZE: 37828
10:53:38.179 ->   FILE: Sun-09-02-25.csv	SIZE: 42827
10:53:38.179 ->   FILE: Thu-13-02-25.csv	SIZE: 10628
10:53:38.179 ->   FILE: Tue-11-02-25.csv	SIZE: 45514
10:53:38.179 ->   FILE: Wed-12-02-25.csv	SIZE: 44545

Si dans la ligne de suppression du fichier, je remplace la variable supprFch par /Fri-07-02-25.csv, la suppression à bien lieu.

Ça fonctionne pour certains jours et pas celui-là. Ça doit être énorme, mais je ne vois pas.

Cordialement.

Pierre.

vous avez une variable

qui pointe vers

Je pense que le souci c'est que votre pointeur n'est plus valide au moment où vous faites

il se peut qu'il reste un temps "correct" jusqu'à ce que la mémoire vienne à être utilisée par autre chose, et c'est sans doute ce qu'il se passe quand vous faites des appels ensuite à des fonctions de LittleFS.

comme vous savez que le nom du fichier tient sur 17 caractères (avec le / - attention vous testez 16 à un endroit) essayez en faisant une copie

const char * remplaceFchHisto() {
  char supprFch[30]; //; // <<==== buffer assez grand, sans doute 18 suffiraient 
  strftime(nom_Fch, 24, "/%a-%d-%m-%y.csv", &timeinfo);
  Serial.print("Demandé : "); Serial.println(nom_Fch);
  File root = LittleFS.open("/");
  File file = root.openNextFile();
  bool vu = false;
  while(file) {
    if (strncmp(file.path(), nom_Fch, 4) == 0) {
      Serial.print("Vu : "); Serial.println(file.path());
      if (strncmp(file.path(), nom_Fch, 16) != 0) {
        strlcpy(supprFch , file.path(),  sizeof supprFch); // <<==== ON FAIT UNE COPIE 
        vu = true;
        Serial.print("A supprimer : "); Serial.println(file.path());
        Serial.print("A supprimer : "); Serial.println(supprFch);
      }
    }
    if (vu == true) {
      break;
    }
    else
      file = root.openNextFile();
  }
  file.close();
  Serial.print("Fichier à supprimer : "); Serial.println(supprFch);
  if (LittleFS.exists(supprFch)) {
    Serial.print("En attente de suppression : "); Serial.println(supprFch); // Le nom du fichier vient de disparaître !!
    if (LittleFS.remove(supprFch)) { // Suppression de l'ancien fichier
      Serial.print("Supprimé : "); Serial.println(supprFch);
    } else
      Serial.println("Pas supprimé !");
  }
  if (!LittleFS.exists(nom_Fch)) {
    file = LittleFS.open(nom_Fch, FILE_WRITE); // Création du nouveau fichier
    file.close();
    Serial.print("Ajoute : "); Serial.println(nom_Fch);
  }
  return nom_Fch;
}

C'est ce que j'ai fait de mon côté et qui a fonctionné. Pour autant, je suppose que la méthode que j'ai utilisée va vous faire bondir : j'ai copié le supprFch dans un String et c'est ce String que j'utilise pour pour l'instruction LittleFS.remove(le String à la place de supprFch).

Je vais implanter votre méthode qui me semble est plus orthodoxe.

C'est tout bon : merci beaucoup.

Cordialement.

Pierre.

:scream: :roll_eyes: :slight_smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.