Назва

rename - змінює назву і місцеположення файлу

Огляд

#include <stdio.h>

int rename(const char oldpath, const char newpath);

Опис

rename міняє назву файлу, переміщуючи його між директоріями, якщо необхідно.

Будь-які інші жорсткі посилання на файл (створених, наприклад, ?link(2)) залишаються незмінними.

Якщо newpath вже існує, його буде автоматично замінено (за кількома умовами - дивіться ПОМИЛКИ нижче), тож не буде такого моменту, коли якийсь процес, що намагається отримати доступ до файлу, не знайде його.

Якщо newpath існує, але операція з якоїсь причини зазнає невдачі, rename гарантує залишити один взірець newpath на місці.

Не зважаючи на це, під час перезапису може виявитись момент у якому oldpath і newpath, обидва, посилатумуться на файл, чия назва змінюється.

Якщо oldpath вказує на символічне посилання, останнє змінить назву; якщо newpath вказує на символічне посилання, його буде перезаписано.

Повернені значення

При вдалому виконанні повертається нуль, при помилці повертається -1 і змінна errno набуде відповідного значення.

Помилки

EISDIR newpath - це вже існуючий каталог, але oldpath не є каталогом.

EXDEV : newpath і oldpath не знаходяться на тій самій файловій системі.

ENOTEMPTY або EEXIST : newpath - це непорожній каталог, томбто містить об'єкти окрім "." або "..".

EBUSY : rename зазнав невдачі, оскільки oldpath або newpath є каталогом, використовуваним якомось процесом (напевне, як поточна робоча директорія, кореневий каталог або сиректорію відкрито для читання) або використовується системою (наприклад, як пункт приєднання інших файлових систем). Система вважає це помилкою. (Зауважте, що не вимагається повернення EBUSY в таких випадках - нічого не забороняє виконувати rename, EBUSY лише дозволяється повернути у випадках, якщо система не в змозі опрацювати такі ситуації.

EINVAL : Нова назва шляху, pathname, містить префікс шляху старої, або, більш узагальнено, відбулася спроба створення каталогу, як підкаталог самого себе.

EMLINK : oldpath вже має максимально-дозволене число посилань на себе, або це був каталог і каталог, що містить newpath має максимально-дозволене число посилань.

ENOTDIR : Складова, що була використана як назва каталогу для oldpath або newpath, насправді, не є такою. Або oldpath є каталогом, а newpath вже існує, але не як каталог.

EFAULT : oldpath або newpath вказують поза межі доступного простору адрес.

EACCES : Немає дозволу на запис каталогу, де міститься oldpath або newpath для дійсного UID процесу, або в одному з каталогів з oldpath або newpath не дозволяється пошук (не встановлений дозвіл на виконання), або oldpath - це каталог, в якому заборонено запис (необхідний для поновлення компоненти "..").

EPERM або EACCES : Каталог, що містить oldpath має встановленим стійкий біт і UID процесу не дорівнює ні ідентифікаційному номеру надкористувача ні UID файлу видалення, ні UID каталогу, де міститься oldpath, або newpath вже існує і каталог, де він міститься має встановленим стійкий біт з і UID процесу не дорівнює ні ідентифікаційному номеру надкористувача ні UID файлу до заміни, ні UID каталогу, де міститься newpath, або файлова система не підтримує зміни назв вказаного типу.

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)