Trier des fichiers
Résolu
Elponito
Messages postés
51
Date d'inscription
Statut
Membre
Dernière intervention
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour à tous,
Je vous expose mon problème, j'aimerais mettre en place une routine permettant d'effectuer un tri sur des fichiers. Plus précisément, je voudrais qu'à partir de l'endroit ou je lance le programme il descende dans l'arborescence et pour chaque fichier, en fonction de son extension une règle est appliquée, exemple: photo non consulté depuis plus de 2 ans le déplacé vers un DD externe. Est-ce possible en C? J'avais commencé à essayé de regardé pour le faire en batch, mais je n'ai rien trouvé de bien convainquant.
Merci d'avance pour vos réponses :)
Je vous expose mon problème, j'aimerais mettre en place une routine permettant d'effectuer un tri sur des fichiers. Plus précisément, je voudrais qu'à partir de l'endroit ou je lance le programme il descende dans l'arborescence et pour chaque fichier, en fonction de son extension une règle est appliquée, exemple: photo non consulté depuis plus de 2 ans le déplacé vers un DD externe. Est-ce possible en C? J'avais commencé à essayé de regardé pour le faire en batch, mais je n'ai rien trouvé de bien convainquant.
Merci d'avance pour vos réponses :)
A voir également:
- Trier des fichiers
- Excel trier par ordre croissant chiffre - Guide
- Renommer des fichiers en masse - Guide
- Fichiers epub - Guide
- Wetransfer gratuit fichiers lourd - Guide
- Explorateur de fichiers - Guide
7 réponses
'lut, en Python 3:
@fiddy: 18 lignes ;)
(et une redondance de code de fou: ça peut être beaucoup plus clean mais ça marche)
from human import idiocy
del idiocy
import os, time year = 365*24*60*60 source = "/tmp/src" dest = "/tmp/bak" def backup(root, filename): os.makedirs(os.path.join(dest, root[len(source)+1:]), exist_ok=True) os.rename(os.path.join(root, filename), os.path.join(dest, root[len(source)+1:], filename)) for root, direc, filenames in os.walk(source): for filename in filenames: if filename.lower().endswith(('.ppt', '.pptx')): if time.time() - os.path.getatime(os.path.join(root, filename)) > 2*year: backup(root, filename) if filename.lower().endswith(('.jpg', '.avi')): if time.time() - os.path.getatime(os.path.join(root, filename)) > 3*year: backup(root, filename)
@fiddy: 18 lignes ;)
(et une redondance de code de fou: ça peut être beaucoup plus clean mais ça marche)
from human import idiocy
del idiocy
En C, tu peux utiliser struct stat.
Par exemple :
Pour afficher la date sous forme intelligible, tu peux utiliser les fonctions du header time.h.
Ensuite, il faudra que tu fasses une boucle pour parcourir tous les fichiers de ton disque, puis que tu mettes tout ceci dans une liste. Que tu tries la liste, etc. Si c'est juste pour te faire un petit outil, je le ferai plutôt en python.
En python, ça se fait très facilement. Probablement en 1 quinzaine de ligne :-). En C, plutôt 150...
Après, à toi de voir si le python te fait peur ou pas :-). Sachant que d'autres langages de script sont également possibles.
Google is your friend
Par exemple :
struct stat buffer; stat(nomFichier, &buffer); printf("Date de dernier acces : %ld\n", buffer.st_atime);
Pour afficher la date sous forme intelligible, tu peux utiliser les fonctions du header time.h.
Ensuite, il faudra que tu fasses une boucle pour parcourir tous les fichiers de ton disque, puis que tu mettes tout ceci dans une liste. Que tu tries la liste, etc. Si c'est juste pour te faire un petit outil, je le ferai plutôt en python.
En python, ça se fait très facilement. Probablement en 1 quinzaine de ligne :-). En C, plutôt 150...
Après, à toi de voir si le python te fait peur ou pas :-). Sachant que d'autres langages de script sont également possibles.
Google is your friend
Bonjour
C'est possible de le faire par programmation, pour cela il te faut utiliser la structure
à bientôt
C'est possible de le faire par programmation, pour cela il te faut utiliser la structure
struct statpour connaitre les attributs de ton fichier comme, la date de la dernière modification/acces, le droit utilisateur/groupe etc
à bientôt
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour,
La bibliothèque standard du C ne permet pas de faire ça.
En revanche, en utilisant les fonctions propres à ton OS, cela devient possible.
Sur quel OS tu es ? Windows ?
Pourquoi ne pas le faire dans un autre langage ? Il y en a des beaucoup plus adaptés pour ce genre de tâches.
Cdlt,
Google is your friend
La bibliothèque standard du C ne permet pas de faire ça.
En revanche, en utilisant les fonctions propres à ton OS, cela devient possible.
Sur quel OS tu es ? Windows ?
Pourquoi ne pas le faire dans un autre langage ? Il y en a des beaucoup plus adaptés pour ce genre de tâches.
Cdlt,
Google is your friend
La cstdlib ne le permet pas, en effet, mais ça peut se faire indépendamment de l'OS vu que ce qu'il demande (liste de fichiers, vérif d'extension et de date) peut se faire avec opendir et la struct stat définies par le standard POSIX(.1-2001).
cstdlib, ce n'est pas une bibliothèque mais un header. De plus ce n'est pas du C mais du C++.
Ensuite, même si beaucoup le sont, tous les OS ne sont pas full-compatible avec la norme POSIX.1-2001. Voilà pourquoi il faut toujours demander l'OS lorsqu'on est sur des fonctionnalités non standard ISO C89/90 ou C99...
Ensuite, même si beaucoup le sont, tous les OS ne sont pas full-compatible avec la norme POSIX.1-2001. Voilà pourquoi il faut toujours demander l'OS lorsqu'on est sur des fonctionnalités non standard ISO C89/90 ou C99...
Merci pour vos réponse :)
En effet fiddy je suis sur Windows, pourquoi en C, car je ne sais pas dans quel autre langage le faire, mais si tu connais un langage plus adapté je suis preneur. Pour exposer un peux plus en détail mon problème, je suis actuellement en stage et l'on a un serveur de fichier sur lequel il y a certains fichiers qui n'ont pas lieu d'être, je doit donc mettre en place une routine, qui permet à partir de règle que j'ai définie de faire un tri sur les fichier. J'ai donc un poste sur lequel sera lancé la routine, le but est donc de parcourir l'arborescence en appliquant les règles, par exemple:
*.ppt: Si non consulté depuis plus de 2 ans -> déplacement vers une sauvegarde en locale
*.xsl: Ne pas toucher.
*.jpg: Si non consulté depuis plus de 3 ans -> déplacement vers une sauvegarde en locale
*.avi: Si non consulté depuis plus de 3 ans -> déplacement vers une sauvegarde en locale
voila en gros, je suis preneur de toutes vos idées car je sais pas trop ver quelle technologie me tourner...
Merci d'avance
En effet fiddy je suis sur Windows, pourquoi en C, car je ne sais pas dans quel autre langage le faire, mais si tu connais un langage plus adapté je suis preneur. Pour exposer un peux plus en détail mon problème, je suis actuellement en stage et l'on a un serveur de fichier sur lequel il y a certains fichiers qui n'ont pas lieu d'être, je doit donc mettre en place une routine, qui permet à partir de règle que j'ai définie de faire un tri sur les fichier. J'ai donc un poste sur lequel sera lancé la routine, le but est donc de parcourir l'arborescence en appliquant les règles, par exemple:
*.ppt: Si non consulté depuis plus de 2 ans -> déplacement vers une sauvegarde en locale
*.xsl: Ne pas toucher.
*.jpg: Si non consulté depuis plus de 3 ans -> déplacement vers une sauvegarde en locale
*.avi: Si non consulté depuis plus de 3 ans -> déplacement vers une sauvegarde en locale
voila en gros, je suis preneur de toutes vos idées car je sais pas trop ver quelle technologie me tourner...
Merci d'avance
Merci beaucoup pour ces réponses :) Je vais me pencher sur le python :)
Du coup, ça fait 15 tout pile. Belle estimation n'est-ce pas ? :-p
pas mal comme code personnellement je ne suis pas trop à l'aise avec le python même si je trouve ce langage extrêmement puissant ceci dit c'est bien
à bientôt
Je rencontre un problème lorsque je veux utiliser un lecteur différent, si je lance le code de gravgun sur C: je n'ai pas de problème, en revanche si je spécifie le chemin source = "E:/src" et la destination dest = "/tmp/bak" (sur C du coup), cela ne fonctionne pas, l'erreur est: "OSError: [WinError 17] Impossible de déplacer le fichier vers un lecteur de disque différent" (par contre si j'execute tout sur E cela marche niquel également) si vous avez une idée d'où ça peut venir :p
Personnellement je ne suis pas trop apte à pouvoir t'aider sur du python, le mieux est de poser directement la question à @gravgun, pour ce qui est du chemin je pense que le programme ne permet que d'explorer tous les sous-dossiers dans le quelle il est executé enfin (corrigé moi si je me trompe)