Trier des fichiers
Résolu
Elponito
Messages postés
55
Statut
Membre
-
fiddy Messages postés 441 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 441 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 :)
7 réponses
-
'lut, en Python 3:
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-
-
-
Salut,
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 -
Bonjour
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) -
J'aurais encore une question de plus pour @gravgun, mon but serait de finir avec un interface graphique qui permet de gérer les règles de tri, en ajouter et les modifier, je pensais passer par une sérialisation des règles, j'aimerais juste savoir si tu pense que c'est faisable, histoire que je perde pas du temps pour rien, si jamais ce n'est pas le cas.. Merci d'avance pour la réponse
-
-
En C, tu peux utiliser struct stat.
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 structurestruct stat
pour 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 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... -
-
-
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 -
Merci beaucoup pour ces réponses :) Je vais me pencher sur le python :)