ИМЯ¶
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@hsys.msk.ru> 1999-2000