2017-01-24 2 views
2

ich diesen Code bin mit den Unterordner eines Verzeichnisses zu erhalten:FSO kehrt nicht vorhandenen Unterordner

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 

Nun, wenn m_sFolder ist „C: \ Benutzer \ MyUser \ Documents“, ein Unterordner „C : \ Benutzer \ MeineBenutzer \ Dokumente \ Eigene Bilder ". "Eigene Bilder" nennt Windows den Ordner "Meine Bilder" in deutscher Sprache.

Der Ordner "C: \ Users \ MyUser \ Documents" enthält jedoch weder "Eigene Bilder", "Bilder" noch "Eigene Bilder".

Der Ordner „Eigene Bilder“ ist hier zu finden: C: \ Benutzer \ MyUser \ Bilder

Kann mir jemand sagen, warum FSO könnte mir sagen will, dass dieses Verzeichnis „C: \ Benutzer \ MyUser \ Dokumente \ Eigene Bilder "existiert?

Ich bin völlig verwirrt.

Antwort

3

Es ist kein Verzeichnis, es ist eine Junction (or Reparse) Point, die wie eine Weiterleitung an einen anderen Speicherort auf der Dateisystemebene ist.

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

in der Befehlszeile wird diese mit einem <JUNCTION> Tag-Liste (im Gegensatz zu <DIR> Gegensatz).

Es gibt keine Notwendigkeit, das BFS zu verwenden, sind die eingebauten Dateisystem-Funktionen werden nicht diese:

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 
1

Wenn Sie darauf bestehen, das BFS über die Verwendung Sie kennen diese Dinge sein müssen. In diesem Beispiel wird versucht, Sie zu informieren und Ihnen die erforderlichen Informationen zu geben:

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 
+0

Vielen Dank. Ihre Bedingung ist nicht erfüllt, aber diese seltsamen Ordner haben die .Attributes = 1046, während alle anderen .Attributes = 16 haben. Können Sie mir sagen, welches Attribut ich anstelle von "If .Attributes And FILE_ATTRIBUTE_REPARSE_POINT Then" überprüfen muss? Vielen Dank. – tmighty

+0

Äh, 'FILE_ATTRIBUTE_REPARSE_POINT' * ist *' 1046', also weiß ich nicht, was ich dir sonst noch sagen könnte. Ich habe keine Ahnung, wie die Bedingung nicht erfüllt werden konnte. Sie müssen nicht richtig testen. Ihre '16' heißt' FILE_ATTRIBUTE_DIRECTORY' wie man erwarten würde. Der oben angegebene Code funktioniert perfekt für mich. – Bob77

Verwandte Themen