Bonjour à toutes et à tous.
Première chose à savoir : j'ai légèrement développé en C ces deux dernières années, mais très légèrement. Je n'ai eu aucun véritable cours de C et j'ai appris le peu que je sais sur le tas. J'ai quelques notions et soif d'apprendre, mais mes connaissances et mon expérience en programmation sont tout de même assez limitées.
Deuxième chose : j'ai évidemment parcouru quelques discussions sur le forum et d'autres sites concernant la fonction find, puisqu'il semblerait que ce soit un exercice phare que les profs aiment donner aux étudiants. J'ai lu pas mal de choses intéressantes, mais j'ai vu tellement de choses différentes que ça m'a un peu embrouillé l'esprit.
Voici le projet que j'ai à réaliser : je dois ré-implémenter la fonction find de Linux en C, avec un maximum d'options. Le programme doit fonctionner sous Linux ET Windows (et là je me pose la question de l'arborescence qui n'est pas la même et comment gérer les "/" de Linux et les "\" de Windows).
Pour le moment, je me suis fixé ces options, qui me semblent être les plus simples à réaliser en plus du find de "base" :
-name
-atime
-ctime
-mtime
-amin
-cmin
-mmin
-size
-type
-delete
-print (de base)
--help
Chaque option serait une fonction dans mon programme.
Concernant l'algorithme, j'ai déjà réfléchis et en gros je compte faire ça :
1) Analyser les arguments.
Je pensais ici utiliser getopt, qu'en pensez-vous ?
Dois-je placer mes différentes options possibles (-name, -size,e tc.) dans un fichier .txt que mon programme lirait pour les placer en arguments dans getopt ?
Admettons que je suive cette logique :
-Tant qu'on ne tombe pas sur un argument commençant par "-", c'est le répertoire dans lequel je dois effectuer ma recherche. S'il n'y a aucun chemin fournit en paramètre, on prend par défaut le répertoire dans lequel on se trouve.
-Si on trouve un argument commençant par "-", ça devrait être une option. On vérifie par rapport aux fonctionnalités du programme (liste des mes options possibles dans un fichier .txt avec un retour à la ligne à la fin de chaque option ?). A ce moment là, comment savoir si mon option attend ou non des arguments derrière, et combien si c'est le cas ?
2) Lister les fichiers et répertoires.
Ma question est ici, pile ou file ? Quels sont les avantages et inconvénients de chacun, et dans le cas présent, lequel me conseillez-vous ?
3) Filtrer la pile selon les critères.
Autant pour le nom du fichier je saurais le faire, mais pour les dates de modifications, etc... comment faire ? Y a-t-il une bibliothèque qui me permettrait de récupérer ces informations sur les fichiers et/ou répertoires parcourus ?
4) Trier la pile.
5) Exécuter -print ou -delete, ou autre...
Pour lister les fichiers et répertoires, je me doute que la fonction devra être récursive. Mais est-ce que les étapes suivantes (3/4/5) doivent être réalisées simultanément, pendant la récursivité, ou pas ?
Merci d'avance pour tout ceux qui pourront me donner une piste ou deux. Si vous avez des fonctions/bibliothèques à utiliser impérativement qui vous viendraient en tête, n'hésitez pas, j'irai jeter un coup d'oeil et voir ce que je peux construire avec ^^
Cordialement,
Un étudiant qui sait depuis 11h59 qu'il doit rendre ce projet pour dimanche 23h59 au plus tard =D
Partager