2

В статье MSDN Hard Links and Junctions можно прочесть следующее:

Жесткая ссылка - это представление файловой системы файла, по которому более одного пути ссылаются на один файл в одном и том же томе. Чтобы создать жесткую ссылку, используйте функцию CreateHardLink. Любые изменения в этом файле мгновенно видны приложениям, которые обращаются к нему по жестким ссылкам на него. Однако размер записи каталога и информация об атрибутах обновляются только для ссылки, по которой было сделано изменение. Обратите внимание, что атрибуты файла отражаются в каждой жесткой ссылке на этот файл, а изменения атрибутов этого файла распространяются на все жесткие ссылки. Например, если вы сбрасываете атрибут READONLY на жесткой ссылке, чтобы удалить эту конкретную жесткую ссылку, и существует несколько жестких ссылок на фактический файл, то вам потребуется сбросить бит READONLY на файле с одной из оставшихся жестких ссылок на верните файл и все оставшиеся жесткие ссылки в состояние READONLY.

Может ли кто-то разобраться в вышеприведенном абзаце?
Разве атрибуты оператора в файле не отражаются в каждой жесткой ссылке на этот файл, эквивалентно ли изменения оператора атрибутам этого файла, распространяющимся на все жесткие ссылки?
Почему сброс значения READONLY может вернуть файл и все оставшиеся жесткие ссылки в состояние READONLY?

РЕДАКТИРОВАТЬ

После прочтения превосходного ответа JdeBP на этот вопрос у меня все еще остаются сомнения.

Я понимаю, что есть частичная копия записи $STANDARD_INFORMATION MFT для каждой жесткой ссылки, указывающей на эту запись, которая согласно ответу даже не обновляется, если только жесткая ссылка не переименована, не создана или не уничтожена. Что происходит, когда кто-то читает атрибуты жесткой ссылки? Я предполагаю, что копия этой твердой ссылки $STANDARD_INFORMATION игнорируется, поскольку она может не отражать текущее состояние, а атрибуты считываются непосредственно из записи MFT $STANDARD_INFORMATION . Кроме того, во время этого процесса никакая информация не обновляется, поскольку это не какая-либо из перечисленных вами операций. Это так?

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

Я не понимаю, что это была не последняя ссылка . Я не вижу, как ссылка, являющаяся последней, имеет какое-либо значение здесь. Сам файл (запись MFT) по-прежнему существует, и его атрибуты можно изменить напрямую (не по какой-либо ссылке). Или это так, что если есть файл, есть ссылка, означающая, что между записями MFT и файлами нет однозначного соответствия?

1 ответ1

5

Как говорит grawity , вторая "перезагрузка" - это либо плохая запись, либо прямая ошибка.

Разве атрибуты оператора в файле не отражаются в каждой жесткой ссылке на этот файл, эквивалентно ли изменения оператора атрибутам этого файла, распространяющимся на все жесткие ссылки?

Нет. В статье говорится о том, что, возможно, слишком много деталей реализации для целевой аудитории. В NTFS каждая запись в MFT может иметь ноль или более атрибутов $FILE_NAME . Они записывают родительский каталог и имя в этом каталоге для каждой жесткой ссылки на файл. Но они также записывают флаги атрибутов файла, даже если эти флаги записаны в единственном атрибуте $STANDARD_INFORMATION записи MFT. Правила представляют собой сложную мелочь, но кратко говоря, $STANDARD_INFORMATION имеет значение, и информация $FILE_NAME даже не обновляется, если только жесткая ссылка не переименована, не создана или не уничтожена - что требует прикосновения к атрибутам $FILE_NAME и т.д. это точка, где текущие флаги атрибутов могут быть распространены на атрибуты $FILE_NAME .

Разработчик, вероятно, объяснил мрачные детали NTFS техническому автору, который написал статью для MSDN. Но на самом деле они не имеют никакого отношения к конечному пользователю или даже программисту приложений. Это внутренние детали того, как работает NTFS. С точки зрения Win32 файл / каталог имеет ровно один набор флагов атрибутов, и его обновление обновляет его, как бы то ни было. Если вы устанавливаете бит R для того, чтобы разрешить удаление жесткой ссылки на файл, то (при условии, что это была не последняя ссылка), нужно снова включить бит R любым способом, чтобы сделать файл снова только для чтения.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .