Entre la version "Février 8" et "Février 10" de https://github.com/laurentbouleau/Exemple, vous avez corriger le problème du namespace à spécifier pour les classes comme "directory_iterator", etc...
Vous avez décidé d'ajouter "std::filesystem::" devant, systématiquement, c'est OK.
Visual Studio est un IDE "moderne", il donne des clés pour corriger des problèmes :
Quand VS indique une erreur, il affiche une petite "ampoule" qui, si vous cliquez dessus et sélectionnez "Afficher les corrections éventuelles", liste un certain nombre de "solution" au problème.
Pièce jointe 650574
Dans l'image précédente, VS vous suggère 2 solutions :
- "Remplacer 'directory_iterator par 'std::filesystem::directory_iterator'"
- "Ajouter 'using namespace std::filesystem'"
Je ne sais pas si vous avez utilisé cette fonctionnalité ou vous avez corrigé "à la main", mais pensez à regarder les suggestions de VS en cas d'erreur de compilation.
Vous avez appliqué la première suggestion mais la second peut aussi être utile.
Moi je vous conseille, dans le cadre de votre projet "Exemple" de définir un alias de namespace en haut de votre fichier .cpp :
namespace fs = std::filesystem;
Comme ça, au lieu de spécifier tout le namespace "std::filesystem::", vous n'avez qu'à écrire "fs::" à la place.
saison.affichier_sous_Dossier(nomSousDossier);
???
je ne comprends pas pourquoi une saison aurait besoin de pouvoir "afficher" un sous répertoire.
Votre "style" de programmation s'améliore grandement (utilisation d'auto, des ranged-loop, etc...) mais je pense que la "conception objet" manque un peu de "maitrise". Mais c'est clairement pas ce qu'il y a de plus simple et évident, je pense.
Un objet, comme votre "saison", ne devrait disposer que de fonctions qui ont un "sens" pour une saison (année, ordre dans la série, etc...)
Le plus "logique", c'est de donner la racine au constructeur de l'objet "serie", dans le constructeur de "Serie", on scanne les répertoires contenus dans la racine, et en fonction de leur nom, de leur contenu, ou autre, on crée des objets "saison" correspondants.
Je parle de ça parce que je ne comprends pas "la question" de votre message de 'Hier, 22h24'.
1 2 3 4
| t = entry.path().wstring();
pos = t.find_last_of(L"\\");
pos++;
t = t.substr(pos); |
C'est le genre de code que l'utilisation de la classe "std::filesystem::path" devrait simplifier/supprimer. Pensez à regarder toutes les fonctionnalités qu'offre ce type de classe.
https://en.cppreference.com/w/cpp/filesystem/path
En particulier :
https://en.cppreference.com/w/cpp/fi.../path/filename (qui porte assez mal son nom)
for (const auto& entry2 : std::filesystem::directory_iterator( ??? )))
Je ne sais pas trop ce que vous cherchez à faire.
Si votre arborescence de fichier correspond à votre arborescence d'objet supposé (une série contient des saisons, qui contient des épisodes) :
Vous donnez la racine au constructeur de "Serie" qui regarde les fichiers et répertoires contenus dans le système de fichier, il (le constructeur de "Serie") en déduit les objet "Saison" à créer, fournit au constructeur de "Saison" un chemin vers le répertoire contenant les informations de la saison, le constructeur de "Saison" fait un peu le même travail que celui de "Serie" mais il initialise les informations de la saison et appel les constructeur d'"Episode".
Attention : changez le contenu de "Exemple.txt", vous avez mis
you /t s "e:\\Séries.[]\\Better Call Saul.[2015-2022]"
Ce qui n'a aucun sens au vue de comment vous vous en servez dans votre code.
Il faudrait plutôt y mettre :
Si vous ne faites pas cela, le code explose à l'exécution car votre code ne gère pas le fait que le répertoire "racine", contenu dans "Exemple.txt", n'existe pas.
ligne 1326 de votre Exemple.cpp :
for (const auto& entry : std::filesystem::directory_iterator(serie.getFileName()))
Ca n'a aucun sens et ça n'explose pas juste parce que j'ai mis "./" dans "Exemple.txt" pour que cela ne plante pas à l'exécution.
Vous créé une variable de nom "entry" en ligne 1306, puis une autre ligne 1326.
C'est casse-gueule d'utiliser des variables avec le même nom, surtout que le code de la ligne 1326 "correct", si on ne change pas le nom de ces variables, ça serait :
for (const auto& entry : std::filesystem::directory_iterator(entry))
Le compilateur y retrouverait peut-être ces petits, mais vous, en tant que programmeur, vous allez plus rien comprendre.
Je vous conseille donc de nommer plus "correctement" ces variables, par exemple :
ligne 1306 :
for (const auto& entry_serie : std::filesystem::directory_iterator((serie.getRacine())))
(Utilisez la fonctionnalité de "Renommage" des noms de variable dans Visual Studio qui est accessible depuis le menu contextuel (clic droit) quand le nom de la variable est sélectionné dans l'éditeur.)
ligne 1326 :
for (const auto& entry_saison : std::filesystem::directory_iterator(entry_serie))
(Utilisation de la fonctionnalité "Renommage" ici aussi pour passer de "entry" à "entry_saison")
1 2
| for (const auto& entry2 : std::filesystem::directory_iterator( ??? )))
{ |
Bizarrement, quand vous posiez la question sur comment lire le contenu des sous-répertoire ("serie.getFileName()" n'est donc clairement pas la solution), vous aviez pris la peine d'utiliser des noms de variables différents. ![:aie:](https://www.developpez.net/forums/images/smilies/aie.gif)
Après, le code dans la boucle ligne 1326 à 1350 n'a pas beaucoup de sens non plus.
Vous pouvez toujours essayer de faire le travail de manière itérative (sans utiliser la conception objet), mais alors, je pense que vous ne devriez pas utiliser de classe ou ne vous en servir que comme des structures en C (sans fonctions associées aux classes).
Si vous poussez la logique "objet" à fond, vous devriez avoir un code proche de :
1 2
| Serie serie(racine);
serie.afficher(); |
Toute la logique de lecture des informations et de construction des objets "Saison" et "Episode" seraient encapsulées dans le constructeur de la classe "Serie".
Partager