2017-01-24 3 views
2

返しますm_sFolderは「C:\ Users \ユーザーMyUserと\ドキュメント」のとき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 

は今、1つのサブフォルダは「Cです:\ Users \ MyUser \ Documents \ Eigene Bilder "を選択します。 「Eigene Bilder」は、Windowsがドイツ語で「My Pictures」というフォルダを呼び出すものです。

ただし、「C:\ Users \ MyUser \ Documents」フォルダには、「マイピクチャ」、「ピクチャ」、「アイギーンビルダ」のいずれも含まれていません。

フォルダ "マイピクチャ" である

が、ここで発見される: C:\ Users \ユーザーMyUserと写真\

FSOは、このディレクトリ「Cことを私に伝えたい理由を誰が教えてもらえます:\ \ユーザーMyUserと\ Documents \ Eigene Bilder "が存在しますか?

私は完全に困惑しています。

答えて

3

これはディレクトリではなく、Junction (or Reparse) Pointです。これは、ファイルシステムレベルの別の場所へのリダイレクトのようなものです。コマンドラインから

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

は(<DIR>ではなく)<JUNCTION>タグでこれらの一覧が表示されます。

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があります。「.AttributesとFILE_ATTRIBUTE_REPARSE_POINT Then」ではなく、どの属性をチェックする必要があるか教えてください。ありがとうございました。 – tmighty

+0

Er、 'FILE_ATTRIBUTE_REPARSE_POINT' *は*' 1046'なので、他に何を教えていいのか分かりません。私は条件がどのように満たされなかったかの手がかりを持っていません。正しくテストする必要はありません。 '16'は' FILE_ATTRIBUTE_DIRECTORY'と呼ばれます。上記のコードは私にとって完璧に機能します。 – Bob77