ИМЯ
rename − изменить имя или расположение файла
КРАТКАЯ СВОДКА
#include <unistd.h>
int rename(const char *oldpath, const char *newpath);
ОПИСАНИЕ
rename переименовывает файл, перемещая его между каталогами, если требуется.
Все прочие жесткие ссылки на файл (созданные с помощью link(2)) не изменяются.
Если newpath уже существует, то он будет атомарно перезаписан (при определенных условиях - смотри ОШИБКИ ниже), так что нет ни одной точки, когда другой процесс, пытающийся обратиться к newpath, не обнаружит его.
Если newpath существует, но операция завершается неуспешно или система аварийно завершает работу, rename гарантируется, что newpath останется нетронутым.
При перезаписи, однако, вероятно будет окно, в котором oldpath и newpath ссылаются на один и тот же файл.
Если oldpath является символической ссылкой, то она переименовывается; если newpath является символической ссылкой, то будет перезаписан файл, на который она указывает.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае успеха возвращается ноль. При ошибке возвращается −1, а errno устанавливается должным образом.
ОШИБКИ
EISDIR |
newpath является существующим каталогом, но oldpath не является каталогом | ||
EXDEV |
oldpath и newpath находятся на разных файловых системах. |
ENOTEMPTY
newpath является непустым каталогом.
EBUSY |
newpath существует и является текущим рабочим каталогом или корневым каталогом какого-то процесса. | ||
EEXIST |
Новое имя пути совпадает с началом старого имени. | ||
EINVAL |
Попытка сделать каталог своим собственным подкаталогом. | ||
EMLINK |
oldpath уже имеет максимальное количество ссылок на него, или это был каталог, а каталог, содержащий newpath, уже имеет максимальное количество ссылок. | ||
ENOTDIR |
Компонент, используемый как каталог в oldpath или newpath в действительности не является каталогом. | ||
EFAULT |
oldpath или newpath указывают за пределы доступного адресного пространства. | ||
EACCES |
Запись в каталог, содержащий oldpath или newpath не разрешена для эффективного uid’а процесса, или один из каталогов в oldpath или newpath не позволяет производить поиск (выполнять), или oldpath был каталогом и не позволял запись в него (необходимую, чтобы обновить ..). | ||
EPERM |
Каталог, содержащий oldpath, имеет sticky-bit, а эффективный uid процесса не равен ни uid’у файла, который нужно удалить, ни uid’у каталога, который его содержит, или файловая система, содержащая pathname, не поддерживает переименование запрошенного типа. |
ENAMETOOLONG
oldpath или newpath слишком длинны.
ENOENT |
Одна из частей каталога в oldpath или newpath не существует или является "висячей" символической ссылкой. | ||
ENOMEM |
Ядру не хватило памяти. | ||
EROFS |
Файл находится на файловой системе, смонтированной только для чтения. | ||
ELOOP |
oldpath или newpath содержат зацикленную символическую ссылку, то есть при ее подстановке происходит ссылка на нее саму. | ||
ENOSPC |
На устройстве, содержащем файл, нет места для новой записи в каталоге. |
СООТВЕТСТВУЕТ
POSIX, 4.3BSD, ANSI C
ОШИБКИ
На файловых системах NFS вы не можете исходить из предположения, что если операция завершилась неудачно, то файл остался не переименованным. Если сервер совершает операцию rename, а затем аварийно останавливается, то перепосланный пакет RPC будет опять обработан, когда сервер восстановит работу, и это вызовет ошибку. Приложение должно справиться с этой ситуацией. См. link(2) за описанием подобной проблемы.
СМОТРИ ТАКЖЕ
link(2), unlink(2), symlink(2), mv(1), link(8).
ПЕРЕВОД
Copyright (C) Alexey Mahotkin <alexm [AT] hsys.ru> 1999-2000