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

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

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

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

  1. Файл може бути каталогом, для якого не можна створити другу жорстку посилання.

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

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

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

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

І т.д.

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

Як перейменувати каталог?

  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, яка може виконувати більш широкий діапазон дій.

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

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

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