Перемещение файла во время его использования - как это работает?

31

Я заметил, что в ОС, отличной от Windows .... то есть в Linux / Mac я могу сделать что-то вроде: - Отправить почтовый индекс другу с целью - Удалить файл, пока он в передаче

И передача не подводит.

Или я могу выполнять такие операции, как ... - запустить фильм - стереть файл - фильм все еще воспроизводится до конца (чтение с диска, а не только буферизация в памяти)

Хотя файлы «удаляются», как я уже говорил, на самом деле они перемещаются в другое место в файловой системе ... то есть в каталог Trash или что-то в этом роде. Поэтому мне кажется, что ОС использует указатель @ файл, который обновляется при перемещении, а не напрямую обращается к файлам.

Может кто-нибудь пролить свет на то, как на самом деле реализована эта потрясающая возможность? Я даже не уверен, что Google, чтобы узнать больше об этом.

Спасибо.

Марио Зильотто
источник
1
В теории, я полагаю, есть два способа, которыми это могло бы произойти. Оба являются реальностью. Файл в памяти. Или файловая система имеет ссылки на файлы, и только ссылка удаляется. Оба являются реальностью. Факт ссылки - то, как программы восстановления могут восстановить вещи. Идея о том, что файл действительно удаляется, когда все программы закрывают его, звучит как чепуха. Вы можете посмотреть на связанные списки (структура данных программирования, чтобы лучше понять концепцию). Или вы можете посмотреть на конкретные файловые системы.
Бароп

Ответы:

29

Запись каталога - это просто указатель на индекс. Индод содержит метаинформацию о файле (кроме имени) и указатели на данные файла (если есть). Когда вы начинаете копировать файл, вы получаете дескриптор для inode.

Операционная система поддерживает количество ссылок на индекс. Пока есть ссылки на инод, инод и данные файла сохраняются. Как только все ссылки на индекс будут удалены, индекс будет освобожден, а пространство, необходимое для файла.

Поскольку у вас есть файл, открытый для копирования, он будет храниться до тех пор, пока ваш процесс не закроет файл. Это должно произойти, когда передача файла завершится, и произойдет, если процесс копирования завершится неудачно. Если передача файла не удалась на полпути, и вы удалили все жесткие ссылки на файл, вы не сможете успешно перезапустить передачу.

РЕДАКТИРОВАТЬ: Как уже отмечалось, перемещение файлов на том же устройстве выполняется без перемещения данных. Вместо этого в каталоге назначения создается новая запись каталога, а исходная запись каталога удаляется.

Можно иметь несколько записей каталога для одного и того же файла. Это так называемые жесткие ссылки. Они создаются путем создания новой записи каталога для файла без удаления исходной записи. Inode файловой системы имеет счетчик ссылок для записи количества записей каталога, указывающих на файл.

РЕДАКТИРОВАТЬ 2: Если процесс завершится сбоем или будет убит, файл будет аккуратно удален, так как количество обращений в памяти будет уменьшено до нуля. Это действие, которое происходит, когда программа заканчивается нормально.

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

BillThor
источник
5
В точку. Я не мог выразить это лучше сам. Кстати, обычная хитрость, если вам нужно какое-то хранилище чистых файлов в программе, - это создать файл /tmpи сразу же unlink(2)его создать . В этот момент в каталоге нет файла (поэтому нечего очищать при выходе или сбое), но ваш процесс все еще имеет доступ к файлу, и никакой другой процесс не может случайно или преднамеренно связываться с ним. Это иллюстрирует свойство интереса.
Норман Грей
Означает ли это, что если открытый файл будет удален во время его использования программой, и произойдет сбой питания, на диске останутся неиспользованные данные, занимающие место на диске? А что если процесс, использующий файл, завершится сбоем или будет убит?
Джейсон С
1
@JasonC Я обновил ответ, чтобы ответить на ваши вопросы.
BillThor
6

Как объяснил Мэтт Дженкинс, ОС (файловая система) отслеживает файлы, которые остаются открытыми приложениями. Пока процесс сохраняет файл открытым, его данные остаются на диске (даже если он был удален и больше не виден или недоступен для других программ).

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

sleske
источник
Не верно в случае OS X / HFS +: Вы можете перемещать файлы, например, в корзину, но не между разделами или удалять их (то есть очищать корзину).
Даниэль Бек
2

Это довольно просто на самом деле. Файл содержит список ссылок - процессов, которые обращаются к файлу. Когда вы удаляете файл, он просто удаляет список из каталога, но не сам файл. Программы, которые все еще имеют открытый файл, могут получить к нему доступ. Файл фактически удаляется только тогда, когда все программы, которые обращаются к нему, закрывают его.

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

Majenko
источник
"Файл поддерживает список ссылок"?
Даниэль Бек
Должно быть "OS или Explorer", а не файл.
Моав
2
На самом деле это будет файловая система.
JRobert
ОС использует файловую систему для хранения ссылок в файле (nlinks в структуре заголовка файла) - там - мы все счастливы;)
Majenko
1
«Ссылки» - это процессы с открытым дескриптором файла и жесткими ссылками (включая имя первого файла) на файл. Блоки данных не помечаются как свободные и доступны для повторного использования до тех пор, пока счетчик ссылок не станет равным нулю.
mpez0
0

В файловых системах Unix файл может иметь одну или несколько жестких ссылок на него. Файл живет до тех пор, пока есть хотя бы один. Когда последний удаляется, пространство файла освобождается. ссылка выше даст вам отправную точку для дальнейшего чтения - особенно смотрите раздел «Счетчик ссылок».

JRobert
источник
1
Правда, но это не то, что здесь происходит. Дело в том, что даже после удаления последней жесткой ссылки файл все равно остается до тех пор, пока все процессы не закроют им свои дескрипторы.
слеске