Баян Гомбоев
ноябрь 2019.
2280

Как работает процесс перемещения файла? Он его копирует, а после удаляет или как-то по другому?

Ответить
Ответить
Комментировать
0
Подписаться
0
2 ответа
Поделиться

В переделах одного тома – просто заменяет ссылку на файл "теперь это лежит здесь", физически ничего не перемещается. Между томами – да, копирует, потом помечает исходник как удалённый. На крупных файлах разница видна на глаз.

В журналируемых файловых системах, типа ntfs это ещё и протоколируется в процессе, чтобы можно было откатить незавершившуюся операцию.

2
0
Прокомментировать

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

Всё пространство диска поделено на последовательные блоки — кластеры (есть еще секторы, дорожки... но это нас не интересует в данном случае). У каждого кластера есть номер. Таким образом мы получаем адресуемое пространство: можем указывать номер кластера и получать доступ к этой порции данных.

Файл не лежит на диске «одним куском». Файл занимает свободные кластеры на диске, и может быть разорван на части (фрагментирован), по этому к файлу нужна сопроводительная информация:

* список номеров кластеров в которых он лежит, заканчивающийся нулём;
* запись оглавления, где содержится имя, атрибуты (только для чтения, системынй, скрытый и т.п., размер, время создания, изменения, последнего обращения к нему), а также номер начального кластера, где лежит файл.
Записи оглавления тоже лежат в определённых кластерах. Если запись описывает файл, то она указывает на кластер, где начинается файл, а если описывает папку — то указывает на кластер, где лежит другое список с оглавлением.

То есть когда мы указываем путь к файлу, то можно начиная с корневого оглавления по пробежаться по оглавлениям папок переходя от кластера к кластеру, потом найти запись оглавления для этого файла, и определить где начинается файл и какую имеет длину. А затем пробежаться по списку номеров кластеров, читая каждый кластер и склеивая их содержимое. Последний кластер занят обычно не полностью, по этому какая часть там лишняя нам покажет общая длина файла которую мы взяли из записи оглавления.

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

1) Если это так, то создаётся новая запись оглавления на новом месте в том оглавлении, которое соответствует целевой папке. А старая запись оглавления для экономии времени не удаляется, а помечается как свободная. Она будет занята при первой возможности. Сам файл и список его размещения на диске при этом не меняются. Перемещение завершено.

2) Если целевой файл находится на другом диске, то в первую очередь происходит копирование файла на новое место. Файл вычитывается так как показано в нелирическом отступлении выше, и записывается в свободные кластеры на другой диск. Как только запись завершена, составляется список размещения файла (цепочка номеров кластеров) и тоже сохраняется в системную область диска. Напоследок в списке оглавления соответствующей папки создаётся запись оглавления для этого файла. Копирование файла завершено. И теперь совсем напоследок происходит удаление исходного файла: запись оглавления помечается как удалённая. Список размещения удаляется. Кластеры, которые ранее занимал этот файл помечаются как свободные. (Я умышленно упустил из объяснения выше, что есть еще одна системная область на диске, где буквально битами (один бит — один кластер) обозначается, какой кластер свободен, а какой занят.)

Вот такая изнурительная работа происходит внутри операционной системы, когда мы перемещаем файлы.

1
0

Можно ли восстановить вырезанные файлы?

0
Ответить

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

Запись оглавления хотя и помечена как удалённая, но ссылка на начальный кластер файла там есть. Если размер файла меньше размера кластера, и при этом этот кластер по таблице занятости числится как свободный, значит он с очень высокой вероятностью содержит всю информацию удалённого файла. Если при этом на этот кластер не ссылаются никакие другие удалённые записи оглавления, то вероятноть = 100%. Если на этот кластер ссылаются несколько удалённых файлов, то в кластере лежат данные файла, у которого максимальная дата изменения. Так могло получиться, если на это место несколько раз попадали разные файлы.

Ну, и всё гораздо сложнее, если файл больше чем 1 кластер (а это как правило так и есть). Мы знаем, где начинался этот файл, но где и в каком порядке лежат остальные его куски понять трудно. Так как запись идёт по свободным кластерам последовательно, то можно попробовать на известную нам длину файла (она есть в заголовочной записи) набрать кластеры, которые числятся свободными. Если туда вклиниваются занятые кластеры, то надо смотреть дату файла к которому они относятся. Более молодой файл вероятнее всего уже затёр куски старого.

Ну и дополнительно надо прыгать по свободным кластерам, и пытаться сложить из них пазл. Например, если это текстовый файл, то слова могут разрываться на границах кластеров, помогая нам восстановить связь между ними. В звуковых файлах тоже можно смотреть на данные и видеть не происходит ли в месте склейки кластеров ступенька, если звуковые колебания отобразить на графике.

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

0
Ответить
Прокомментировать
Ответить
Читайте также на Яндекс.Кью
Читайте также на Яндекс.Кью