Учитывая следующий сценарий: у меня есть клиент Windows, который подключен к общему ресурсу SMB. Я хочу рекурсивно погрузиться в каталоги на этом общем ресурсе, чтобы что-то сделать с файлами (представьте, что для них вычисляются хэши sha1, если превышен определенный размер).
Что я обычно делаю: рекурсивно dirInfo.EnumerateDirectories()
ловит некоторые исключительные случаи, такие как несанкционированный доступ, и помещаю файлы в очередь в поток оператора (чтобы затем вычислить sha1).
Проблема: Рекурсивные символические ссылки. Мой сценарий тестирования довольно прост
me@smb:~$ ls -l /home/me/tmp/recursionStartsHere
lrwxrwxrwx recursion -> /home/me/tmp/recursionStartsHere
Я пробовал (кроме googlin) использовать dirInfo.Attributes.HasFlag(FlagAttributes.ReparsePoint)
для обнаружения символических ссылок, что (конечно) не работает. Подход грубой силы похож на индексацию каждого каталога с накопленной контрольной суммой из их содержимого, которое может даже не быть свободным от коллизий.
Поскольку у меня сейчас нет практических идей, как я могу сказать, что определенный каталог является (только) символической ссылкой? Конечно, я бы предпочел независимую от платформы, поэтому мой код работает так же для удаленного SMB, как а также на локальных NTFS-дисках.