如何在使用IO.Directory.EnumerateDirectories时忽略Documents文件夹中的连接点

Dim dirs As List(Of String) dirs = New List(Of String)(IO.Directory.EnumerateDirectories(path, "*", SearchOption.AllDirectories)) 

以下代码大部分工作正常,但由于连接点,在c:\ users \ documents文件夹中总是失败。

我得到以下exception和堆栈跟踪。

有没有一种方法来排除连接点和使用EnumerateDirectories或将不得不编写代码手动获取目录名称和忽略/处理交界点?

例外:
{“访问path'C:\ Users \ jkfredri \ Documents \我的音乐'被拒绝。”}

堆栈跟踪:
System.IO.FileSystemEnumerableIterator 1.AddSearchableDirsToStack(SearchData localSearchData)" & vbCrLf & " at System.IO.FileSystemEnumerableIterator ”在System.IO.__ Error.WinIOError(Int32 errorCode,String maybeFullPath)“&vbCrLf&”1.MoveNext() System.Collections.Generic.List中的“&vbCrLf&” 1..ctor(IEnumerable 1集合)“&vbCrLf&”位于C:\ Users \\ Visual Studio中BUDWindows.BUD.FileSystem.Directory.GetDirectoriesList(String path) \ Projects \ Desktop Applications \ BUDWindows \ Classes \ FileSystemManager.vb:第292行“

有一个FileAttribute指示它是否是一个ReparsePoint条目。 为了解决这个问题,你需要一个DirectoryInfo对象。 由于每一个都需要测试,你可以使用DirectoryInfo.EnumerateDirectories()来获取它们的列表,而不是从你得到的名字中逐一创建它们。

然后,如果您只想要名称,请在ReparsePoint被排除后Select该名称。 扩展方法可以完成大部分的工作:

 Dim dInfo = New DirectoryInfo(dPath) Dim DirNames = dInfo.EnumerateDirectories("*.*", SearchOption.TopDirectoryOnly). Where(Function(q) IsReparse(q) = False). Select(Function(q) q.FullName). ToList() For Each s As String In DirNames.ToArray() DirNames.AddRange(Directory. EnumerateDirectories(s, "*.*", SearchOption.AllDirectories)) Next 

然后,一个帮手方法:

 Private Function IsReparse(d As DirectoryInfo) As Boolean Return ((d.Attributes And FileAttributes.ReparsePoint) = FileAttributes.ReparsePoint) End Function 

这将获取Reparse属性为false的顶级文件夹名称,然后迭代这些名称以获取子文件夹名称。 前提是Reparse文件夹将仅位于顶层。 然后就这样,它只是将子文件夹添加到列表中。

显然,即使首先对ReparsePoint进行测试也不会阻止它使用SearchOption.AllDirectories查找它们中的子文件夹。

您可以将FileAttributes测试放在WHERE方法中,但是根据您在做什么,您可能会发现您也想跳过具有System属性的测试。