Fonction validant l'existant d'un chemin d'accès en C

Fermé
tranduil - 23 mars 2015 à 10:01
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 26 mars 2015 à 00:38
Bonjour,

Je cherche une fonction en C qui me permet de définir si un chemin d'accès passé en paramètre existe.

Je suis limité à l'usage de ces fonctions:
write, opendir, readdir, closedir, stat, lstat, getpwuid, getgrgid, listxattr, getxattr, time, ctime, readlink, malloc, free, perror, strerror et enfin exit.

Je cherche comme je peux mais je ne trouve pas quelle fonction me permet de faire ce que je veux et je ne suis pas sur qu'il y en ait une. Et après de nombreuses recherches, je sait comment faire ce test dans a peu près tout les langages connu mais toujours pas en C (>_<) fichu web..

Si vous trouvez un moyen détourné de faire la vérification de l'existence d'un chemin d'accès, je serais tout aussi satisfait que si vous me disiez quelle fonction sert à faire ce test.

4 réponses

jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
23 mars 2015 à 16:55
0
c'est bien beau mais ça ne check que les dossier, et du coup j'aurais un reste qui serais tout ce qui concerne les fichier, liens, périphériques et autres qui serais ignoré.

l'usage de opendir ne marche pas sur un lien vers un dossier en plus, il faut donner le readlink du lien sur le dossier, donc c'est d'autant plus obsolète car il me faut lister les liens sur dossier comme le dossier qui est linké par le lien (sauf si l'option ls -l est envoyé mais ce n'est pas tout le temps).
0
[Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 1 083
23 mars 2015 à 17:23
Bonjour tranduil,

Les fonctions que tu mentionnes sont des fonctions C POSIX.

Sur un système POSIX, tu as des pages de manuel, que tu peux afficher en ligne de commande en tapant "man", un espace et la commande sur laquelle tu cherches à te documenter.

par exemple :
man stat
, et tu appuies sur la lettre
q
pour sortir de la page de manuel.

C'est ta documentation de base pour comprendre ce que font tes fonctions.

Tu trouves de la doc en ligne aussi, par exemple :

https://pubs.opengroup.org/onlinepubs/009695399/functions/stat.html (standard POSIX)
https://linux.die.net/man/2/stat (un des nombreux sites qui reproduisent des pages de manuel Linux sur le Web)

C'est pour un exercice, une devinette, un pari, un gage ?

Dal
0
euh.. j'avais fait un gros pavé et mon ordi a redémarrer mon navigateur...

donc pour faire bref, les mans anglais sont trop précis pour moi et les man français trop incomplet pour m'aider, je me suis renseigné un bon moment avant de venir vous embêtez ;)

ca m'aiderais beaucoup que vous me donniez une piste concrète car on est limité en temps sur le projet. pour le moment je suis passé outre mais j'aimerais bien revoir cette partie du code quand j'aurais une piste ou si je fini plus tot que prévu.

pour les chemins inexistant, après le test avec stat, j'appelle perror pour savoir ce qui as posé problème et j'ai entendu dire que des appels de errno en boucle peuvent mener cette variable miracle à buger, vous me conseillez de changer de fonction ? un appel de strerror peut-être ?

pour gerer certains cas, je pense que une fonctions pour check les permissions sur le chemin d'accès peut aider mais je pense que il ne faut pas que ça pour compléter mon code.

voila, merci de m'aider si possible et bonne suite à vous.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
23 mars 2015 à 22:16
Bonjour,

Rien de possible en standard.
En revanche, tu peux tout simplement lire le fichier avec readlink() et si la fonction renvoie -1 et que errno vaut ENOENT tu sais que le fichier n'existe pas.

Cdlt
0
je vais faire des tests et je revient certifier cette solution ;)
0
tranduil > tranduil
25 mars 2015 à 07:13
je n'ai trouve aucun chemin d'acces existant sur mon disque qui passait ce filtre, merci :)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836 > tranduil
Modifié par fiddy le 25/03/2015 à 07:28
Ça serait bien que tu montres ce que tu as écrit comme test pour que l'aide soit plus efficace.
0
[Dal] Messages postés 6175 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 30 avril 2024 1 083
Modifié par [Dal] le 25/03/2015 à 10:26
@traduil:
https://linux.die.net/man/2/readlink

si c'est un chemin d'accès existant, ou un chemin vers autre chose qu'un lien symbolique, readlink va renvoyer une erreur (-1) et mettra errno à EINVAL. Malgré l'erreur, tu peux en déduire que ce chemin existe (mais que ce n'est pas un chemin vers un lien symbolique).

si tu n'as pas d'erreur (autre chose que -1), c'est un lien symbolique existant, mais readlink ne te dira pas si le lien pointe sur quelque chose qui lui même existe (contrairement à stat).

il y a d'autres erreurs, éventuellement à traiter selon ce que l'on te demande ou tes choix de conception (par exemple EACCES, qui peut être renvoyé par stat également, entre autres).

@fiddy: pourquoi ta préférence pour readlink plutôt que stat ?

Dal
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
26 mars 2015 à 00:38
Disons que stat() retourne trop d'informations (structure) et est généralement utilisé pour d'autres problèmes. Mais bon, au vu des fonctions proposées, c'est peut-être la moins pire finalement.
0