Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PR_СП_лекции_укр.doc
Скачиваний:
6
Добавлен:
22.04.2019
Размер:
697.34 Кб
Скачать

2.7.3 Перейменування файлів і каталогів

Операція перейменування має на увазі зміну назви елементу каталога. Потрібно створити нове жорстке посилання викликом link і видалити старе посилання викликом unlink.

Але в цьому випадку виникає ряд проблем:

  • файл може бути каталогом, для якого не можна створити друге жорстке посилання;

  • перейменований об'єкт може опинитися в іншому каталозі. Якщо це каталог тієї ж файлової системи, то проблем не виникає, але якщо інший, то виникне конфлікт, оскільки link може створювати жорсткі посилання тільки в межах однієї файлової системи. Зрозуміло, можна створити символічне посилання в новому каталозі, але це не «перейменувати»;

  • якщо необхідно «перейменувати» (фактично — «перемістити») каталог з однієї файлової системи в іншу, то доведеться перемістити ціле дерево підкаталогів зі всім їх вмістом. Перемістити лише порожні каталоги буде недостатньо;

  • в межах однієї файлової системи можна створити декілька жорстких посилань на один і той же файл - всі вони посилаються на один і той же індексний вузол, який не змінюється. Якщо буде необхідно перемістити файл в іншу файлову систему, то виникає наступна проблема. Створюється нове жорстке посилання, віддаляється стара, але при цьому «стара» копія файлу залишиться на місці, оскільки файл не можна видалити, поки на нього є хоч одне посилання. Таким чином, замість «перейменування» виходить копіювання.

  • якщо змінити повний шлях до файлу, що міститься в символічному посиланні, то в результаті отримаємо неправильне посилання.

І так далі

Тобто операція перейменування не така проста, як здається на перший погляд.

  1. копіювати каталог і вкладені підкаталоги зі всім їх вмістом, а потім видаляти старий каталог, навіть якщо він просто перейменовується, залишаючись в тому ж самому батьківському каталозі. – Не підходить оскільки це дуже великий об'єм роботи;

  2. використовувати системний виклик link для каталогів, нехай навіть викликати його може тільки суперкористувач. - знехтуваний POSIX і замінений на rename

  3. використовувати новий системний виклик, який буде в змозі виконувати переміщення каталогів усередині файлової системи. - Це єдиний спосіб перейменувати каталог бсз повного копіювання його вмісту.

rename — перейменовує файл

# include <stdio.h>

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

oldpath, старе повне ім'я

newpath нове повне ім'я

Повертає 0 у разі успіху -1 у разі помилки (код помилки -в змінної errno)

Виклик rename виконує приблизно наступну послідовність дій:

  1. Якщо newpath існує, то він віддаляється за допомогою unlink або rmdir.

  2. Виконується link (oldpath, newpath), навіть якщо oldpath є каталогом.

  3. Викликом unlink або rmdir віддаляється oldpath.

Крім того, він має свої особливості і обмеження.

  1. Крок 2 працює і з каталогами, навіть якщо процес не володіє правами суперкористувача (процесу досить мати право на запис в батьківський каталог newpath).

  2. Якщо newpath існує, тоді і newpath, і oldpath повинні бути одного типу, або файли, або каталоги.

  3. Якщо файл переміщається в новий каталог, потрібно вказати ім'я файлу в новому каталозі явно

  4. Якщо newpath існує і є каталогом, він повинен бути порожній (аналогічне правило існує і у rmdir). На кроці 3, якщо oldpath — каталог, він віддаляється, навіть якщо це непорожній каталог, оскільки його вміст вже є в newpath.

  5. якщо oldpath є символічним посиланням, то rename працює з нею, а не з тим, на що вона посилається.

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

На перший погляд здається, що кроки 1, 2 і 3 можна оформити у вигляді бібліотечної функції, але, на жаль, немає способу змусити її працювати подібно до системного виклику.

На основі системного виклику rename створена утиліта mv, яка може виконувати ширший діапазон дій.

  • переміщати окремі файли і каталоги між файловими системами.

  • переміщати групи файлів і каталогів.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]