По-видимому, у нас некоторое разногласие в терминах. Попробую систематизировать. Заранее извиняюсь за длинный пост.
Прежде всего хочу уточнить, что я сейчас буду рассматривать работу исключительно с точки зрения обычного пользователя, который знать не знает про всякие MFT, файловые потоки и т.д. Для него то, что мы называем файловыми записями (или ссылками) - это просто файлы, и всё. В угловых скобочках я буду писать уточнения, "невидимые" для этого обычного пользователя,
и там я буду использовать максмально корректную терминологию, обозначенную в первой же такой вставке.
Итого:
1. На диске (под диском здесь и далее я понимаю исключительно NTFS-раздел) существуют файлы и каталоги в стандартной древовидной организации. <Под файлами тут подразумеваются именно файловые записи внутри каталогов! Есть три "уровня": 1 - собственно данные файла, лежащие где-то на диске; 2 - MFT-запись, указывающая, где эти данные собственно лежат; 3 - одна или несколько файловых записей внутри различных каталогов, ссылающиеся на эту самую MFT-запись. Пользователь видит только самый верхний уровень, т.е. файловые записи в каталогах, и, естественно, воспринимает их как самые обычные файлы. Здесь и далее под файловыми записями я понимаю исключительно записи внутри каталогов. Для записей внутри MFT я так и буду писать: MFT-запись.> Для каждого из файлов можно определёнными методами узнать некую, пока что абстрактную, величину: счётчик жёстких ссылок (я пользовался двумя вещами: плагином собтственного изготовления и расширением оболочки Windows, которое добавляет в диалог свойств файла новую вкладку с информацией о количестве ссылок и о потоках, оба способа дают один результат, что неудивительно).
2. Теперь что происходит, когда пользователь создаёт жёсткую ссылку. Пусть "оригинальный" файл -
C:\123\file.dat, а тот, который создали -
C:\456\file2.dat. Пользователь, создав этот второй файл, запрашивает количество ссылок у первого файла, и узнаёт, что теперь это число равно двум, тогда как раньше оно равнялось 1. <Оно и логично: ведь раньше на соответствующую MFT-запись ссылалась только одна файловая запись, а теперь - две.> Итого, пользователь теперь видит ДВА файла, у обоих одинаковое содержимое, одинаковый размер, атрибуты и т.д. <Под атрибутами я понимаю самый что ни на есть стандартный набор: Скрытый, Системный, Только для чтения...> При попытке изменить один файл, меняется и другой. Если пользователь попытается узнать число ссылок у ВТОРОГО файла, он получит то же самое значение - 2. <Опять-таки, логично. Вторая файловая запись ведь ссылается на ту же самую MFT-запись, у которой сейчас счётчик установлен в значение 2.> Теперь если пользователь проведёт поиск всех файлов на диске, у которых счётчик ссылок равен двум, то он найдёт ДВА файла:
C:\123\file.dat и
C:\456\file2.dat.
3. При удалении любого из этих двух файлов пользователь заметит, что свободное место на диске не увеличилось (так же, как при создании ссылки оно не уменьшалось), а счётчик другого (оставшегося) файла станет равным снова 1. <Правильно: файловая запись была удалена, счётчик ссылок MFT-записи, на которую ссылалась эта файловая запись, при этом уменьшился, но поскольку он нуля не достиг, данные файла удаляться не стали.> Теперь у него снова один-единственный файл.
Так вот, как несложно понять, этим пользователем являюсь я сам. Я ожидаю, что ситуация будет в точности такая, как я только что длинно и пространно описывал. Но, к моему удивлению, ситуация, наблюдаемая на моём диске, отличается от вышеописанной. Я вижу ОДИН файл <файловую запись>, у которого счётчик ссылок равен ДВУМ, и поиск по всему диску не находит больше ни одного файла <т.е. - ни одной файловой записи, не считая первой!>, у которого счётчик тоже был бы равен двум!
Основная моя предпосылка: если счётчик равен двум, то значит, на диске просто обязаны находиться две различные файловые записи, ссылающиеся на одну MFT-запись. Эти файловые записи будут мне видны как самые обычные файлы. Но поиск, который, понятное дело, выполняется исключительно по файловым записям (не зная ни о каких MFT), находит только одну запись. Если она одна - то почему счётчик равен двум? Понятно, что данные файла находятся в единственном экземпляре, но счётчик-то считает не количество копий данных, а количество файловых записей, на эти данные ссылающихся!