| | |
rename - Changer le nom ou l'emplacement
d'un fichier.
#include <stdio.h>
int rename(const char *oldpath, const
char *newpath);
rename renomme un fichier, en le déplacant vers
un autre répertoire si besoin est.
Tous les autres liens matériels (créés
avec link) restent inchangés.
Si newpath existe deja, il sera écrasé (avec
quelques restrictions, voir le paragraphe ERREURS), de manière à ce qu'à
aucun moment, un autre processus tentant d'accéder à newpath ne le voit
absent. Si l'opération échoue pour une raison quelconque, rename garantit
la présence d'une instance de newpath en place.
Néanmoins, pendant un écrasement,
il se trouve un court instant pendant lequel à la fois oldpath et newpath
font référence au fichier.
Si oldpath correspond à un lien symbolique,
le lien est renommé; si newpath correspond à un lien symbolique, le lien
est écrasé.
rename renvoie 0 s'il réussit, ou -1 s'il échoue,
auquel cas errno contient le code d'erreur.
- EISDIR
- newpath est un
répertoire existant mais oldpath n'est pas un répertoire
- EXDEV
- oldpath et
newpath ne sont pas sur le même système de fichiers.
- ENOTEMPTY ou EEXIST
- newpath est un répertoire non vide (contient autre chose que "." et "..").
- EBUSY
- Le renommage a échoué car oldpath ou newpath est un répertoire utilisé
par un processus (peut-être comme répertoire de travail, ou comme répertoire
racine, ou ouvert en lecture), ou il est utilisé par le système (comme
point de montage par exemple). Le système a donc considéré qu'il y avait
une erreur. (Notez qu'il n'est pas indispensable de renvoyer EBUSY dans un
tel cas - rien n'empêche d'effectuer le renommage malgré tout - mais il est
permis de retourner EBUSY si le système n'arrive pas à gérer une telle situation).
- EINVAL
- Une partie du nouveau chemin contient en préfixe l'ancien chemin,
ou plus généralement, un répertoire ne peut pas être déplacé dans ses propres
sous-répertoires.
- EMLINK
- oldpath a déjà un nombre maximal de liens, ou bien
c'est un répertoire, et le répertoire contenant newpath a le nombre maximal
de liens.
- ENOTDIR
- Un élément utilisé dans oldpath ou newpath n'est pas un
répertoire, ou oldpath est un répertoire et newpath existe mais n'est pas
un répertoire.
- EFAULT
- oldpath ou newpath pointent en dehors de l'espace d'adressage
accessible.
- EACCES
- Les droits d'écriture dans le répertoire contenant oldpath
ou newpath ne sont pas autorisés pour l'UID effectif du processus, ou bien
un des répertoires de oldpath ou newpath ne permet pas le parcours, ou
encore oldpath était un répertoire et ne permet pas l'écriture (nécessaire
pour mettre à jour les entrées `.' et `..' ).
- EPERM
- Le répertoire contenant oldpath
a son Sticky-bit positionné, et l'UID effectif du processus n'est ni celui
de Root, ni celui du fichier à déplacer, ni celui du répertoire le contenant,
ou alors le système de fichiers contenant pathname ne permet pas le renommage
de fichiers.
- ENAMETOOLONG
- oldpath ou newpath est trop long.
- ENOENT
- Un répertoire
contenu dans oldpath ou newpath n'existe pas, ou est un lien symbolique
pointant nulle part.
- ENOMEM
- Pas assez de mémoire pour le noyau.
- EROFS
- Le
fichier est sur un système de fichiers en lecture seule.
- ELOOP
- oldpath ou
newpath contient une référence circulaire (à travers un lien symbolique).
- ENOSPC
- Le périphérique contenant le fichier n'a pas de place pour une nouvelle
entrée de répertoire.
POSIX, BSD 4.3, ANSI C
Sur les systèmes
de fichiers NFS, ce n'est pas parce que l'opération a échoué que le fichier
n'a pas été renommé. Si le serveur effectue le déplacement, et s'effondre,
la RPC transmise qui sera traitée lorsque le serveur sera à nouveau en
état va indiquer un échec. L'application doit supporter ce genre de problème.
Voir link(2)
pour un cas similaire.
link(2)
, unlink(2)
, symlink(2)
,
mv(1)
, link(8)
.
Christophe Blaess, 1997.
Table des matières
© 1996-2000 Adaptation française "Christophe Blaess"
| |