2017-01-24 2 views
2

Я использую этот код, чтобы получить вложенные папки в каталоге: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 "существует?

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

ответ

3

Это не каталог, это Junction (or Reparse) Point, который как перенаправление в другое место на уровне файловой системы.

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 
1

Если вы настаиваете на использование 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 
+0

Спасибо. Ваше состояние не выполнено, но в этих странных папках есть .Attributes = 1046, а у всех остальных есть .Attributes = 16. Можете ли вы рассказать мне, для какого атрибута мне нужно проверить вместо «If .Attributes And FILE_ATTRIBUTE_REPARSE_POINT Then»? Спасибо. – tmighty

+0

Er, 'FILE_ATTRIBUTE_REPARSE_POINT' * is *' 1046', поэтому я не уверен, что еще я могу вам сказать. Я понятия не имею, как это условие не может быть выполнено. Вы не должны правильно его тестировать. Ваш '16' называется' FILE_ATTRIBUTE_DIRECTORY', как и следовало ожидать. Код, который я дал выше, отлично работает для меня. – Bob77

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