Champ Valeur
Auteur·e Élise
Édition 2024-03-04
Durée 1 session
Taille des équipes 1~3 personnes
login des auteurs·rices dans author.txt
Rendu via git, dépôt $YEAR_tp_readdir, droits en lecture à delivery_collector
Compilation make avec règles all, clean, fclean, re
Binaires mini_ls : exécutable
ut.out : tests unitaires

Barème

Critères Points
Étape 1 5
Étape 2 5
Étape 3 5
Étape 4 5
Total des critères 20
Malus par ligne contenant une faute de norme -0,5
Malus dépôt sale -5
Note maximale 20

Règlement de projet

Prévention de la triche

La réalisation de cet exercice est assujettie aux règles en vigueur dans l’école en matière de triche et de normalisation. Tricher vous expose à de graves sanctions.

Vous devez respecter les règles de normalisation suivantes : https://git.ecole-89.com/eriizu/coding_style/src/branch/main/norm.md

Le non-respect de la norme vous fera perdre une partie ou la totalité des points qui auraient pu être acquis, sur l’ensemble du rendu.

Fichiers à rendre et compilation

La structure de votre dépôt doit être la suivante :

  • Makefile à la racine de votre dépôt
  • fichiers *.c dans src/
  • fichiers *.h dans include/
  • fichiers *.c de tests unitaires criterion dans test/

Votre Makefile doit au minimum avoir les règles all, clean, fclean et re

Vous devez aussi avoir une recette par binaire demandé dans le cartouche de sujet. La recette all doit dépendre de celles de binaires demandés.

Tests unitaires

Chacune de vos fonctions doit avoir des tests unitaires associés.

Fonctions autorisées et interdites

Pour tout le sujet, les fonctions autorisées sont :

  • write
  • malloc
  • free
  • opendir
  • readdir
  • closedir
  • strerror

Introduction

Nous avons déjà vu comment travailler le contenu des fichiers, aujourd’hui on va regarder comment travailler avec des dossiers et les métadonnées des fichiers.

Théorie : readdir

Pour lire le contenu d’un dossier, on doit ouvrir un dir pointer avec opendir. Si la fonction nous renvoie NULL c’est qu’elle n’a pas réussi à ouvrir le dossier.

Sur un dossier ouvert on peut regarder les entrées du répertoire avec readdir qui nous renvoie un pointeur sur struct dirent (lit. directory entry). Chaque entrée du repertoire est un fichier ou un dossier contenu dans le repertoire.

Lorsque readdir renvoie NULL, on sait qu’il n’y a pas d’autres entrées.

Quand on a fini avec un dossier, on utilise closedir pour libérer les resources associées.

#include <dirent.h>
#include <stdio.h>
#include <unistd.h>

int main(void)
{
	DIR *dir;
	struct dirent *current_entry;

	dir = opendir("./");
	if (dir == NULL) {
		return (1);
	}
	current_entry = readdir(dir);
	while (current_entry) {
		puts(current_entry->d_name);
		current_entry = readdir(dir);
	}
	closedir(dir);
}

Étape 1 : début

Écrivez un programme mini_ls qui prend en argument un ou plusieurs noms de dossiers ou rien. Si aucun nom de dossier n’est passé en argument, vous travaillerez avec le dossier courant à la place.

Si vous n’avez qu’un dossier en argument ou aucun et que vous travaillez sur le dossier courant : affichez simplement le contenu du dossier, sans les fichiers cachés. Affichez le nom des fichiers, séparés par des espaces et terminés par un retour à la ligne.

Si vous avez plusieurs dossiers, faites la même chose, ajoutez juste une ligne vide et le nom du dossier que vous allez afficher avant chaque dossier.

$ ./mini_ls src include
src:
main.c readdir.c

include:
mini_ls.h tata.h

Étape 2 : fonction de tri

Écrivez la fonction suivante :

void strtab_sort(char **strtab);

Elle doit trier les chaînes de caractères du tableau strtab par ordre ASCII.

Algorithme de base du tri à bulle :

  • on commence au début du tableau ;
  • tant qu’on est pas sur la dernière case du tableau :
    • si l’élément actuel est plus grand que l’élément suivant :
      • on les intervertit,
    • on passe à l’élément d’après,
  • si on a fait un changement lors de notre traversée du tableau :
    • on recommence ;
  • si on a pas fait de changement lors de notre dernière traversée du tableau :
    • le tableau est trié.

Enfin : vous devez écrire des tests unitaires pour votre fonction de tri

Étape 3 : tri des fichiers

Modifiez votre programme mini_ls de sorte qu’à chaque fois que vous affichez le contenu d’un dossier, il soit trié par ordre ASCII.

Étape 4 : affichage des erreurs

Modifiez votre programme mini_ls de sorte que si un des arguments n’est pas un dossier, vous affichez une erreur à l’aide de strerror.

Les erreurs doivent être au format suivant:

av0: nom_du_fichier: détails du problème
./mini_ls: patate: no such file or directory
./mini_ls: patate: not a directory
./mini_ls: patate: permission denied