Tout jeune sur ce site et en pleine découverte des possibilités du langage C++.
Pour info : Je crée un programme sur CodeBlocks qui exécute un logiciel avec ShellExecute(). Ce logiciel crée une arborescence de dossier et y met des fichiers au format .pdf . Exemple : c:\...\dossier\31_12_2019_09_15\ 0 (Liste des documents)\ fichiers.pdf .
Il y a entre 3 et 4 dossier (31_12_2019_09_15) généré par jour avec leurs sous dossiers (0 (Liste des documents)) et fichiers (.pdf).
Je souhaiterai supprimer les DOSSIERS (31_12_2019_09_15) vieux de plus de X jours.
Plus tard dans mon développement, je souhaiterai déplacer mes fichiers .pdf de un cran dans cette arborescence.
La solution la plus simple a implementer me paraitrait de parcourir tous les dossiers et de checker a chaque fois leurs dates de creation, puis de supprimer tout les dossiers ne respectant pas ta condition.
N'hesites pas si tu veux que je precise,
“Any fool can write code that a computer can understand.
Good programmers write code that humans can understand.” -- Martin Fowler
Tellement d'informations que je m'y perd. J'ai compris l'idée mais le montage du code est plus complexe. J'ai suivi la piste du SHFileOperationA et autres qui semblent intéressantes.
J'aimerai avoir un exemple si possible se rapprochant de mon intention ? L'idée de comparer la date de création du dossier (31_12_2019_09_15) et la date du jour me semble intéressante. Peut être y a t'il plus simple.
Après réflexion, je privilégierai plutôt un tri sur le nom (vu son format = 31_12_2019_09_15 ( 0 ) ). Oui y 'a bien un " ( 0 )" a la fin et dois aussi faire avec ... C'est peut être moins simple a coder mais je valide cette solution. Autour y aura d'autres logiciels qui interféreront et très souvent les attributs changent. Le nom du dossier lui fera "preuve" de date de création.
Le hic est de convertir et donc faire des opérations avec des valeurs de la structure dirent->d_name (char) avec un int de la structure tm.
Donc ça revient à faire une analyse de chaine ? Convertir ta chaine "31_12_2019_09_15" en date ? Si c'est toujours comme ça, un petit sscanf pour remplir une structure, et après on trie selon la structure ?
Fvirtman = Alors si on as la même définition du terme "analyse de chaine" ==>OUI. Mais difficile de faire une opération sur ces éléments (sauf si après conversion la fonction mktime me permet de tester.)
Si tu as un bout de code a tester pour que je regarde si cela colle, ce serai sympa.
Alors je vais te proposer un bout de code qui contient un peu de C (sscanf) et du C++, c'est un peu bâtard entre deux langages, mais sscanf est puissante.
(pas testé, je fais ça de tête il faudra peut être adapter)
Soit tachaine = "31_12_2019_09_15"
// transformation d'une chaine (tachaine) en tableau lexicographique
std::vector<int> datetime;
datetime.resize(5); // année, mois, jour, heure, minute
// toi tu as jour,mois,année,heure,minute
sscanf(tachaine.c_str(),"%d_%d_%d_%d_%d_%d",&datetime[2],&datetime[1],&datetime[0],&datetime[3],&datetime[4]);
A la sortie, tu as datetime = [2019,12,31,9,15]
Du coup, après, tu compares tes tableaux datetime ou l'année est d'abord, puis le mois, puis le jour, puis l'heure, puis les minutes, donc il suffit de comparer, le plus fort d'abord : on parle de comparaison lexicographique :
Pour comparer datetime1 et datetime2 par exemple :
Fvirtman merci pour ta proposition. Je souhaite "trier" pour supprimer les dossiers vieux de X jours. D'ailleurs pas besoin de prendre en compte l'heure.
A l'étape ou je suis je dispose de 2 tableaux de char (datedujour et nomDossier) au format AAAAMMJJ (que je réutilise plus tard dans mon programme). Chaque case des tableaux[i] comprend un chiffre (le 3 de 31 par exemple qui serai dans l'avant dernière case). Voilà le contenu de mes tableaux :
datedujour[9]=20200103 //tableau de char
nomDossier[9]=20191231 //tableau de char
Je n'ai pas repris ta solution car je n'arrive pas a l'adapter. Mon exemple est pas mal car année, mois et jour sont différents et couvrent donc plus ou moins toutes les possibilités.
Je veux supprimer les dossiers vieux de 7 jours en me basant sur le nom du dossier (JJ_MM_AAAA_HH_MM ( 0 ). Je lie donc le nom des dossier.
DIR * rep = opendir("C:\\...\\dossier");
struct dirent * nomDossier;
while ((nomDossier = readdir(rep)) != NULL)
{
printf("%s\n", nomDossier->d_name); //pour contrôle visuel de la chaîne //C'est ici que je ne sais plus comment faire
}
J’espère être lisible. C'est dans la boucle While que je vais devoir coder mon action mais je bloque sur la méthode.
Votre code ressemble bien plus à du C qu'à du C++.
Quand c'est faisable, restez le plus possible avec le C++.
Vous convertissez des dates en chaine de caractère.
Vous devez des opérations sur le temps (>7jours par exemple), c'est donc l'opération inverse que vous devez faire : chaine de caractère vers date.
Ainsi, vous pourrez facilement faire des comparaisons et savoir si le répertoire doit être supprimé sans aucune autre opération que de comparer la date actuelle et la conversion en date du nom du fichier.
Pour créer un "tm" à partir des valeurs AAAA, MM, et DD :
J'ai clairement compris ce que je dois faire (me contredire si nécessaire) : transformer s_now et nomDoss en date pour ensuite calculer la différence entre les 2 dates.
Revoici mon code modifié :
int main()
{
time_t now = time(NULL);
struct tm tm_now = *localtime(&now);
int i,TAILLE=sizeof "JJ/MM/AAAA";
char s_now[TAILLE]={0};char nomDoss[TAILLE]={0};
strftime(s_now, TAILLE,"%d_%m_%Y", &tm_now); //JJ/MM/AAAA:HH:MM:SS
cout<<s_now<<endl; /* A ce stade s_now = {JJ_MM_AAAA} d'aujourd'hui */
DIR * rep = opendir("C:\\...\\dossier");
struct dirent * nomDossier;
while ((nomDossier = readdir(rep)) != NULL)
{
for (i=0;i<=9;i++)
{nomDoss[i]=nomDossier->d_name[i];}
cout<<nomDoss<<endl; /* A ce stade nomDoss = {JJ_MM_AAAA} du nom de dossier */
.........PANNE D ENCRE........... }
}
Je bloque au niveau de ma PANNE D ENCRE. Soit ce n'est pas strftime() qu'il faut utiliser pour transformer en date, soit je ne connais pas la bonne syntaxe. asctime() fait le travail inverse que je recherche.
Vous vous prenez la tête juste parce que vous ne voulez pas faire un simple "#include" de "<ctime>" ???
Vous faites ce que je vous est proposé, créer "timestamp1" et "timestamp2" pour pouvoir utiliser la fonction "difftime", mais au lieu d'utiliser cette fonction toute faite vous vous prenez la tête avec des "abs" de mktime divisée par une valeur en dur bien dégueu.
Franchement, vous cherchez vraiment la complexité.
P.S.: le bug est ligne 7 et 10 parce que vous ne gérez pas correctement les cas aux limites, mais laissez tomber ce code tout moisi.
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
Merci pour votre avis Bacelar !! droit et efficace !!
Je ne l'ai pas fait avec ctime parceque j'ai toujours le message d'erreur avec strptime. Ne parvenant pas à le résoudre je suis passé au plan B.
Mais votre jugement qualifié m'intéresse et si vous souhaitez m'aider (pour apprendre) je veux bien. D'ailleurs je vais revoir mon code, vous avez raison.
C'est vraiment la merde les API C, vive le vrai C++. ======> Comment fais t'on pour distinguer une commande ou méthode d'écrire apaprtient au C ou C++ ?? (j'ai appris le C il y a 7 ans de cela et jamais pratiqué et je reprend maintenant (sans que ce soit mon boulot)).
Utilisez "strftime" et pas "strptime". ========> strf = datetime to string, strp = string to datetime.
Désolé ========> Pas de soucie
A chaque fois que je peux, je reprendrai mon code et le ferai propre et 100% c++ et portable (avec votre aide ).
J'ai l'impression que vos sscanf feront bien l'affaire, quitte à bien vérifier les bornes des valeurs (à vous les joies des années bissextiles et des fuseaux horaires).
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
Tri sur dossier
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
“Any fool can write code that a computer can understand.
Good programmers write code that humans can understand.” -- Martin Fowler
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html