ВЖесткие связи и соединенияВ статье MSDN можно прочитать следующее:
Жесткая ссылка — это представление файла в файловой системе, с помощью которого более одного пути ссылаются на один файл в одном томе. Чтобы создать жесткую ссылку, используйте функцию CreateHardLink. Любые изменения в этом файле мгновенно становятся видны приложениям, которые обращаются к нему через жесткие ссылки, ссылающиеся на него. Однако размер записи каталога и информация об атрибутах обновляются только для ссылки, через которую было внесено изменение. Обратите внимание, что атрибуты файла отражаются в каждой жесткой ссылке на этот файл, и изменения атрибутов этого файла распространяются на все жесткие ссылки. Например, если вы сбросите атрибут READONLY на жесткой ссылке, чтобы удалить эту конкретную жесткую ссылку, и есть несколько жестких ссылок на фактический файл, то вам нужно будет сбросить бит READONLY на файле из одной из оставшихся жестких ссылок, чтобы вернуть файл и все оставшиеся жесткие ссылки обратно в состояние READONLY.
Может ли кто-нибудь понять смысл вышеприведенного абзаца?
Разве утверждение неатрибуты файла отражаются в каждой жесткой ссылке на этот файлэквивалентно утверждениюизменения атрибутов этого файла распространяются на все жесткие ссылки?
ПочемусбросREADONLY бит можетвернуть файл и все оставшиеся жесткие ссылки в состояние «ТОЛЬКО ДЛЯ ЧТЕНИЯ»?
РЕДАКТИРОВАТЬ
Прочитав превосходный ответ JdeBP на этот вопрос, у меня все еще остались сомнения.
Я понимаю, что существует частичная копия записи MFT $STANDARD_INFORMATION
для каждой жесткой ссылки, указывающей на эту запись, которая, согласно ответу,даже не обновляется, если жесткая ссылка не переименована, не создана или не удалена. Что происходит, когда кто-то считывает атрибуты жесткой ссылки? Я полагаю, что копия этой жесткой ссылки $STANDARD_INFORMATION
игнорируется, поскольку она может не отражать текущее состояние, а атрибуты считываются напрямую из записи MFT $STANDARD_INFORMATION
. Кроме того, во время этого процесса никакая информация не обновляется, поскольку это не какая-либо из перечисленных вами операций. Так ли это?
Если кто-то отключит бит R, чтобы разрешить удаление жесткой ссылки на файл, то (предполагая, что это не последняя ссылка) придется снова включить бит R любым способом, чтобы снова сделать файл доступным только для чтения.
Теперь я не понимаюпредполагая, что это не последняя ссылкачасть. Я не вижу, как то, что ссылка последняя, имеет здесь какое-либо значение. Все еще есть сам файл (запись MFT), и можно напрямую (не через какую-либо ссылку) изменять его атрибуты. Или это так, что если есть файл, то есть и ссылка, что означает, что нет однозначного соответствия между записями MFT и файлами?
решение1
Как grawity
говорится, вторая «перезагрузка» — это либо плохое написание, либо явная ошибка.
Разве это не утверждение?атрибуты файла отражаются в каждой жесткой ссылке на этот файлэквивалентно утверждениюизменения атрибутов этого файла распространяются на все жесткие ссылки?
Нет. Статья утверждает что-то, что, возможно, слишком подробно описывает реализацию для целевой аудитории. В NTFS каждая запись в MFT может иметь ноль или более$FILE_NAME
атрибуты. Они записывают родительский каталог и имя в этом каталоге для каждой жесткой ссылки на файл. Но онитакжефлаги атрибутов файла записи,Несмотря на тоЭти флаги записываются в единственный $STANDARD_INFORMATION
атрибут записи MFT. Правила немного сложны, но, если коротко, то $STANDARD_INFORMATION
это то, что имеет значение, и $FILE_NAME
информация даже не обновляется, если только жесткая ссылка не переименована, не создана или не уничтожена — что требует прикосновения к атрибутам $FILE_NAME
, и поэтому является точкой, в которой текущие флаги атрибутов могут быть распространены на $FILE_NAME
атрибуты.
Разработчик, вероятно, объяснил кровавые подробности NTFS техническому автору, который написал статью MSDN. Но они на самом деле не имеют никакого отношения к конечному пользователю или даже к программисту приложений. Это внутренние подробности того, как работает NTFS. С точки зрения Win32 файл/каталог имеет ровноодиннабор флагов атрибутов, и обновление его является обновлением, как бы это ни было сделано. Если кто-то выключает бит R
, чтобы разрешить удаление жесткой ссылки на файл, то (предполагая, что это была не последняя ссылка) нужно R
снова включить бит, каким-либо образом, чтобы снова сделать файл доступным только для чтения.