Как найти все жесткие и символические ссылки на файл/папку (Windows и UNIX)?

Как найти все жесткие и символьные ссылки на файл/папку в Windows (используя стандартные функции ОС)?

Что противостоит UNIX?


person Artyom Ionash    schedule 01.07.2015    source источник


Ответы (1)


Символические ссылки:

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

Для Linux Как вы определить с помощью stat(), является ли файл символической ссылкой? может помочь.

Для Windows... ну, точки повторной обработки не объяснимы в одной строке.
Нетривиально проверить, является ли файл символической ссылкой из C++.

Жесткие ссылки:

Linux: Опять же (обычно) невозможно без поиска всех файлов и проверки номера инода.

Windows: в зависимости от используемой файловой системы FindFirstFileName и FindNextFileName
могут быть полезны, но, как сказано, они не всегда будут работать (ReFS...)

person deviantfan    schedule 01.07.2015
comment
В Windows символическая ссылка реализуется точкой повторной обработки, которую можно обнаружить с помощью GetFileAttributes() и FindFirstFile()/FindNextFile() через атрибут FILE_ATTRIBUTE_REPARSE_POINT. Жесткие ссылки также должны обнаруживаться (я не знаю, как это сделать), потому что инструмент командной строки fsutil имеет hardlink list, который может находить жесткие ссылки на заданный файл (по крайней мере, в Win7/2008+), а SysInternals также имеет параметр FindLinks инструмент для поиска жестких ссылок. - person Remy Lebeau; 01.07.2015
comment
@RemyLebeau Я забыл FILE_ATTRIBUTE_REPARSE_POINT (facepalm) . Но все же не так просто проверить, симлинк это или другой вид RP. И да, жесткие ссылки обнаруживаются, как описано в ответе, но только в определенных файловых системах (NTFS да, ReFS не во всех версиях...) - person deviantfan; 01.07.2015
comment
На самом деле, когда атрибут FILE_ATTRIBUTE_REPARSE_POINT присутствует в файле/папке, структура WIN32_FIND_DATA из FindFirstFile()/FindNextFile() указывает на Повторная обработка тега точки в поле dwReserved0. Один из доступных тегов — IO_REPARSE_TAG_SYMLINK. Это задокументировано: вы можете определить если точка повторной обработки является символической ссылкой, проверяя, является ли значение тега IO_REPARSE_TAG_SYMLINK. - person Remy Lebeau; 01.07.2015
comment
FindFirstFileNameW/FindNextFileNameW должны работать во всех стандартных локальных файловых системах, поддерживающих жесткие ссылки. Это, вероятно, все, что вам нужно для жестких ссылок. - person Harry Johnston; 02.07.2015