2015-03-07 4 views
1

В Windows 7 есть несколько каталогов, которые имеют имена с древних времен и не могут быть доступны. Я имею в виду такие каталоги, как «C: \ Documents and Settings» и «C: \ Dokumente und Einstellungen», где настоящая папка «C: \ Users». Другой - «C: \ Program» для локализованных систем. Эти каталоги отображаются при итерации всех каталогов с помощью Directory.GetDirectories, но доступ к ним недоступен. При попытке доступа к ним вызывается UnauthorizedAccessException. Я мог его поймать, но это вызывает дополнительное время, которое замедляет сканирование. Я бы предпочел не смотреть в эти поддельные каталоги в первую очередь. (Мне интересно, почему они даже там, и могу ли я просто удалить их, но это еще один вопрос.)Охватывать каталоги ссылок на совместимость Windows

Так что же это хороший способ обнаружить такие ловушки, прежде чем попасть в них? Я предполагаю, что это какая-то ссылка, но есть разные типы ссылок (и все, что связано с мужеством NTFS, без мирского пользователя), и все же я не знаю, как это обнаружить из кода.

Я знаю, что мне все еще нужно обрабатывать это исключение, но если я уже заранее знаю, что операция не будет работать, я бы не стал делать это быстро. Сканирование диска уже достаточно медленное.

Мой код не должен запускаться с правами администратора, и он не ожидает найти что-либо полезное в этих связанных каталогах.

+0

Устранение исключения может вызвать дополнительное время, но имеет ли это влияние на время выполнения? Вполне возможно, что код, который вам нужен, чтобы избежать этого, на самом деле стоил бы дороже, чем просто принятие того, что вам придется иметь дело с исключением. – Ceisc

+0

В DACL запрещается перечислять все ACE, которые предотвращают их перечисление. Но они все еще могут быть пройдены, например. 'dir"% SystemDrive% \ Documents and Settings \% USERNAME% "'. – eryksun

+1

Держитесь подальше от любого каталога с атрибутами «Скрытый» и «Система». –

ответ

2

DirectoryInfo.FileAttributes содержит атрибут ReparsePoint в случае символической связанной папки:

// Code from LinqPad, not sure it compiles in IDE: 
DirectoryInfo di = new DirectoryInfo(@"c:\documents and settings"); 
Console.WriteLine("{0}", di.Attributes); // Hidden, System, Directory, ReparsePoint, NotContentIndexed 
+0

Но будет ли OP хотеть пропустить все точки повторной обработки или только некоторые из них, созданные Microsoft? Бьюсь об заклад, другие точки повторной обработки будут хороши, чтобы спуститься. – dsolimano

+0

Я не знаю, я никогда не сознательно создал точку повторной обработки для себя или видел, что они использовались на практике для чего-либо помимо этих типов папок с псевдонимом .... –

+0

Я использовал их широко для монтирования томов внутри других томов, перемещать данные из-под программ с жестко заданными путями и для развертывания программного обеспечения с легким откатом в моей рабочей среде. Если OP пишут какое-то программное обеспечение для себя, он может уйти, игнорируя точки повторной обработки, но если он продает программное обеспечение другим, я буду злиться, если он не работает в моей среде, потому что я использовал довольно базовую функцию файловой системы. – dsolimano

1

Если производительность ваша цель, вы могли бы сделать лучше, чем рекурсивно переборе папки - вы можете прочитать MFT непосредственно. Это не бладно, но очень быстро. Вот вам tutorial за грязную работу, если вам интересно.

+0

Интересный подход, я включил его в список вещей, чтобы попробовать. – ygoe

 Смежные вопросы

  • Нет связанных вопросов^_^