Как найти все жесткие и символьные ссылки на файл/папку в Windows (используя стандартные функции ОС)?
Что противостоит UNIX?
Как найти все жесткие и символьные ссылки на файл/папку в Windows (используя стандартные функции ОС)?
Что противостоит UNIX?
Символические ссылки:
Вам придется искать все файлы на всех жестких дисках и т.д. и т.п. и проверить каждый из них по отдельности. В противном случае невозможно получить список символических ссылок для определенного файла.
Для Linux Как вы определить с помощью stat(), является ли файл символической ссылкой? может помочь.
Для Windows... ну, точки повторной обработки не объяснимы в одной строке.
Нетривиально проверить, является ли файл символической ссылкой из C++.
Жесткие ссылки:
Linux: Опять же (обычно) невозможно без поиска всех файлов и проверки номера инода.
Windows: в зависимости от используемой файловой системы FindFirstFileName
и FindNextFileName
могут быть полезны, но, как сказано, они не всегда будут работать (ReFS...)
GetFileAttributes()
и FindFirstFile()
/FindNextFile()
через атрибут FILE_ATTRIBUTE_REPARSE_POINT
. Жесткие ссылки также должны обнаруживаться (я не знаю, как это сделать), потому что инструмент командной строки fsutil
имеет hardlink list
, который может находить жесткие ссылки на заданный файл (по крайней мере, в Win7/2008+), а SysInternals также имеет параметр FindLinks
инструмент для поиска жестких ссылок.
- person Remy Lebeau; 01.07.2015
FILE_ATTRIBUTE_REPARSE_POINT
(facepalm) . Но все же не так просто проверить, симлинк это или другой вид RP. И да, жесткие ссылки обнаруживаются, как описано в ответе, но только в определенных файловых системах (NTFS да, ReFS не во всех версиях...)
- person deviantfan; 01.07.2015
FILE_ATTRIBUTE_REPARSE_POINT
присутствует в файле/папке, структура WIN32_FIND_DATA
из FindFirstFile()
/FindNextFile()
указывает на Повторная обработка тега точки в поле dwReserved0
. Один из доступных тегов — IO_REPARSE_TAG_SYMLINK
. Это задокументировано: вы можете определить если точка повторной обработки является символической ссылкой, проверяя, является ли значение тега IO_REPARSE_TAG_SYMLINK.
- person Remy Lebeau; 01.07.2015