绕过Windows兼容性链接目录

Windows 7有一些从古代就有名字的目录,无法访问。 我的意思是像“C:\ Documents and Settings”和“C:\ Dokumente und Einstellungen”这样的实际文件夹是“C:\ Users”的目录。 另一个是本地化系统上的“C:\ Program”。 当用Directory.GetDirectories迭代所有的目录但是不能被访问时,这些目录会显示出来。 试图访问它们时,会引发UnauthorizedAccessException 。 我可以抓住它,但它会导致额外的时间,减慢我的扫描。 我宁愿避免首先查看那些虚假的目录。 (我想知道为什么他们在那里,是否我可以删除它们,但这是另一个问题。)

那么在实际陷入它们之前,检测这些陷阱的好方法是什么? 我猜这是某种链接,但是有不同types的链接(以及来自NTFS的内容,没有世界上的用户可以创build自己),但我仍然不知道如何从代码中检测到。

我知道我仍然需要处理这个例外情况,但是如果我已经事先知道一个操作不起作用,我想不要这样做来保持速度。 磁盘扫描已经够慢了。

我的代码不应该以pipe理权限运行,也不希望在这些链接的目录中find有用的东西。

在符号链接文件夹的情况下, 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 

如果性能是你的目标,你可以做比递归迭代文件夹更好 – 你可以直接读取MFT。 这不是一件简单的事情,但速度非常快。 如果你有兴趣,这里有一个做肮脏工作的教程 。