Gilliek
9déc/100

Raisonnement naif

NOTE: Pardonnez la faute dans le titre (naif -> naïf), mais mon cher WordPress refuse de me mettre un "ï" ...

Il y a quelques temps de cela, je suis tombé par hasard sur un tutoriel en C qui parlait d'une bibliothèque (dirent, utilisée pour ouvrir/parcourir un répertoire). L'auteur, propose à un moment une fonction pour déterminer si l'élément courant est un répertoire ou un fichier :

int isDir(struct dirent* ent)
{
    if ((strchr(ent->d_name, '.')) == NULL) /* Si le nom du fichier n'a pas de point (une extension). */
        return 1;
    else
        return 0;
}

Je ne vous donne volontairement pas le lien vers le tutoriel. Mon but n'est pas de critiquer l'auteur ni son tutoriel (qui, soit dit en passant, est très bon hormis cette fonction), mais de mettre l'accent sur les "raisonnements naïfs" que peut avoir le programmeur.

Petite précision importante au passage : Ce tutoriel présente la bibliothèque pour GNU/Linux et Windows, en mettant quand même l'accent sur Linux.
Regardons maintenant ce bout de code de plus près !

Vous l'aurez sans doute remarqué, l'auteur propose de vérifier l'extension pour déterminer s'il s'agit d'un répertoire ou d'un fichier. Aïe ! En plus d'être absurde parce qu'on peut très bien mettre un point dans le nom d'un dossier (ex. : les dossiers cachés), les fichiers n'ont pas forcément d'extension (!) ...

Bref, il s'agit d'un raisonnemnt très naïf qui conduit souvent à de gros bugs dans un programme.

Moralité de l'histoire : bien réfléchir à ce qu'on fait et surtout connaître l'OS (Système d'exploitation) sur lequel on travaille.
Et comme je suis gentil (:-P), je vous mets une fonction correcte :

int
is_dir(const char *path)
{
	struct stat buf;

	if (stat(path,&buf) == -1){
		perror("Error ");
		return -1;
	}

	return S_ISDIR(buf.st_mode);
}

Et il faut inclure (en plus des libs "de base"):

sys/types.h
sys/stat.h
unistd.h

Je ne vous mets pas ces #include en entier parce que cet abruti de WordPress me les supprime (sans doute à cause des chevrons ...)