Переміщення файлу під час використання - Як це працює?


31

Я помітив, що в ОС, що не працює з Windows .... тобто Linux / Mac я можу робити такі речі, як: - Надіслати поштову другу другому над метою - Видалити файл під час передачі

І передача не провалюється.

Або я можу робити такі операції, як .. - запустити фільм - стерти файл - фільм все ще відтворюється до завершення (читати з диска, а не просто буферувати в пам'яті)

Хоча файли "видаляються", як я вже згадував, вони насправді переміщуються в інше місце у файловій системі ... тобто у каталог сміття чи щось таке. Тому мені здається, що ОС використовує вказівник @ файл, який оновлюється, коли він рухається, а не отримує доступ до файлів безпосередньо.

Чи може хтось пролити світло на те, як реально реалізується ця можливість AWESOME? Я навіть не впевнений, що в Google, щоб дізнатися більше про нього.

Дякую тобі.


1
Теоретично я припускаю, що це може статися 2. Обидва - реальність. Файл знаходиться в пам'яті. Або файлова система має посилання на файли, і видаляється лише посилання. Обидва - реальність. Факт посилань полягає в тому, як неповторні програми можуть відновити речі. Думка про те, що файл фактично видаляється, коли всі програми, що мають доступ до нього, закривається, звучить як дурниця. Ви можете ознайомитись із пов'язаними списками (структура даних програмування, щоб зрозуміти концепцію більш глибоко). Або ви можете дізнатися про конкретні файлові системи.
барлоп

Відповіді:


29

Запис у каталозі - це лише вказівник на індекс. Inode містить метаінформацію про файл (крім імені) та покажчики на дані файлу (якщо такі є). Коли ви починаєте копіювати файл, ви отримуєте ручку до inode.

Операційна система підтримує кількість посилань на inode. Поки є посилання на inode, зберігаються inode та дані файлу. Після того, як всі посилання на inode будуть видалені, inode є і звільняється простір, необхідний файлу.

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

EDIT: Як зазначали інші, переміщення файлів на одному пристрої відбувається без переміщення даних. Замість цього в каталозі призначення створюється нова запис каталогу, а вихідний запис каталогу видаляється.

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

EDIT2: Якщо процес виходить з ладу або вбивається, файл буде чисто видалено, оскільки кількість доступу до пам'яті зменшиться до нуля. Це дія, яка відбувається, коли програма закінчується нормально.

У разі відключення живлення або іншого невпорядкованого відключення системи, fsckперед його повним встановленням на диске знадобиться (перевірка файлової системи). Залежно від стану структури інода та каталогу на диску, буде відновлено простір, файл залишиться в каталозі або буде зроблено новий запис у lost+foundкаталозі. Результати залежать від того, які зміни були передані на диск або записані в журнал файлових систем.


5
Саме так. Я не міг би зробити це краще сам. До речі, загальним трюком, якщо вам потрібне зберігання файлів подряпин в межах програми, є створення файлу /tmpі негайно unlink(2)його. На той момент у каталозі немає жодного файлу (тому нічого не можна очищати при виході чи збої), але ваш процес все ще має доступ до файлу, і жоден інший процес не може випадково чи навмисно зіткнутися з ним. Це ілюструє майно, що цікавить.
Норман Грей

Чи означає це, що якщо відкритий файл видаляється, коли програма використовує його, і відбувається збою живлення, цілі дані залишаться на займаному просторі накопичувача? Що робити, якщо процес, що використовує файл, виходить з ладу або вбивається?
Джейсон C

1
@JasonC Я оновив відповідь, щоб відповісти на ваші запитання.
BillThor

6

Як пояснив Метт Дженкінс, ОС (файлова система) відслідковує файли, які відкриваються програмами. Поки процес зберігає файл відкритим, його дані залишаються на диску (навіть якщо він був видалений і більше не видно або доступний для інших програм).

Зауважте, що наслідком цього є те, що місце, яке займає файл, може бути повернене лише після того, як останній процес, що використовує його, закрив його. Ось найчастіші запитання щодо операцій з файловою системою Linux / Unix: "Команда" df "говорить, що розділ заповнений, а" du "повідомляє про вільний простір" (див., Наприклад, http://batleth.sapienti-sat.org/projects/FAQs/ext3- faq.html ). Якщо вам потрібно звільнити місце, недостатньо для видалення великих файлів (наприклад, журналів), ви також повинні переконатися, що жоден процес не залишає їх відкритими (як правило, проблема з логінами).


Не вірно у випадку OS X / HFS +: Ви можете переміщувати файли, наприклад, у кошик, але не через розділи або видаляти їх (тобто випорожнювати кошик).
Даніель Бек

2

Насправді це досить просто. У файлі міститься список посилань - процесів, які мають доступ до файлу. Коли ви видаляєте файл, він просто видаляє список із каталогу, але не сам файл. Програми, які все ще мають відкритий файл, все ще можуть отримати до нього доступ. Файл видаляється лише тоді, коли всі програми, які мають доступ до нього, закривають його.

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


"У файлі зберігається список посилань"?
Даніель Бек

Має бути файл "ОС або Провідник", а не файл.
Моав

2
Це фактично була б файлова система.
JRobert

ОС використовує файлову систему для зберігання посилань у файлі (посилається на структуру заголовка файлу) - там - ми всі раді;)
Majenko

1
"Посилання" - це обидва процеси з відкритою ручкою до файлу та жорсткими посиланнями (включаючи ім'я першого файлу) на файл. Блоки даних не позначаються вільними і доступні для повторного використання, поки кількість відліку не перейде до нуля.
mpez0

0

У файлових системах unix файл може мати одне або кілька жорстких посилань на нього. Файл живе до тих пір, поки існує хоча б один. Коли останній вилучається, вільний простір файлу звільняється. Посилання вище дасть вам вихідну точку для більшого читання - див. особливо "Лічильник ліній".


1
Щоправда, але це не те, що тут відбувається. Справа в тому, що навіть після видалення останнього жорсткого посилання файл все ще залишається, поки всі позори не закриють ручки для них.
sleske
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.