FSO возвращает несуществующие подпапки

Я использую этот код, чтобы получить подпапки каталога:

Dim fo As Scripting.Folder
Set fo = fso.GetFolder(m_sFolder)

Dim nSubfolder As Scripting.Folder

For Each nSubfolder In fo.SubFolders

    Debug.Print "Folder " & fo.Path & " has subfolder " & nSubfolder 

Next

Теперь, когда m_sFolder - "C:\Users\MyUser\Documents", одна подпапка - "C:\Users\MyUser\Documents\Eigene Bilder". "Eigene Bilder" - это то, что Windows называет папкой "Мои рисунки" на немецком языке.

Однако папка "C:\Users\MyUser\Documents" не содержит ни "Мои рисунки", ни "Изображения", ни "Eigene Bilder".

Папка "Мои рисунки" находится здесь: C: \ Users \ MyUser \ Pictures

Кто-нибудь может сказать мне, почему FSO может сказать, что этот каталог "C:\Users\MyUser\Documents\Eigene Bilder" существует?

Я полностью сбит с толку.

2 ответа

Решение

Это не каталог, это точка соединения (или повторной обработки), которая похожа на перенаправление в другое место на уровне файловой системы.

dir "C:\Users\MyUser\Documents\" /ad

Из командной строки перечислю их с <JUNCTION> тег (в отличие от <DIR>).

Нет необходимости использовать FSO, встроенные функции файловой системы не будут включать эти:

Dim path As String: path = "C:\Users\MyUser\Documents\"
Dim dirn As String

dirn = Dir$(path, vbDirectory)

Do While dirn <> ""
    If (GetAttr(path & dirn) And vbDirectory) = vbDirectory And dirn <> "." And dirn <> ".." Then
        Debug.Print path & dirn
    End If
    dirn = Dir$()
Loop

Если вы настаиваете на использовании FSO, вы должны знать об этом. Этот пример делает попытку быть осведомленным и должен предоставить вам информацию, необходимую для решения этой проблемы:

Const ssfPERSONAL = 5
Const FILE_ATTRIBUTE_REPARSE_POINT = &H400&
Dim TargetFolderPath As String
Dim SubFolder As Scripting.Folder
Dim SubFile As Scripting.File

'Don't early-bind to Shell32 objects, Microsoft has failed
'to maintain binary compatibility across Windows versions:
TargetFolderPath = CreateObject("Shell.Application").NameSpace(ssfPERSONAL).Self.Path
Debug.Print TargetFolderPath
With New Scripting.FileSystemObject
    With .GetFolder(TargetFolderPath)
        For Each SubFolder In .SubFolders
            With SubFolder
                Debug.Print .Name;
                Debug.Print " ["; .Type;
                If .Attributes And FILE_ATTRIBUTE_REPARSE_POINT Then
                    Debug.Print ", reparse point";
                End If
                Debug.Print "]"
            End With
        Next
        For Each SubFile In .Files
            With SubFile
                Debug.Print .Name; " ["; .Type; "]"
            End With
        Next
    End With
End With
Другие вопросы по тегам