Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / System / Datei / Subdir

Prüfen, ob Unterverzeichnisse existieren

Historie
26.06.2001Erste Version (nach einer Idee von Francesco Balena)

Problem

Wird die Information benötigt, ob ein Verzeichnis Unterverzeichnisse enthält, so ist dies mit "klassischen" VB-Mitteln nur durch (u.U. zahlreiche) Aufrufe der Dir- und GetAttr-Funktionen möglich. Mit der API-Funktion SHGetFileInfo dagegen kann das Gleiche mit einer einzigen Abfrage erreicht werden.

Beispiel

Der folgende Code-Abschnitt entfernt einen Ordner nur dann, wenn sich keine Unterverzeichnisse darin befinden:

If HasSubdir("D:\Test\") Then
  MsgBox "Ordner nicht löschbar"
Else
  Kill "D:\Test\*.*" 'Ggf. Dateien löschen
  RmDir "D:\Test\"   'Ordner löschen
End If

Code / Quelltext

Die folgende API-Routine muss im Deklarationsteil eines Moduls bekanntgemacht werden:

Private Declare Function SHGetFileAttributes _
    Lib "Shell32" Alias "SHGetFileInfoA" ( _
    ByVal pszPath As Any, ByVal dwFileAttributes As Long, _
    psfi As Any, ByVal cbFileInfo As Long, _
    ByVal uFlags As Long) As Long

Die eigentliche Funktion ruft die gerade gezeigte API-Routine auf und liest die entsprechende Eigenschaft durch Bit-Vergleich aus:

Public Function HasSubdir(ByRef Path As String) As Boolean
  Const SFGAO_HASSUBFOLDER = &H80000000
  Const SHGFI_ATTRIBUTES = &H800
  Dim Mem(1 To 88) As Long

  'FileInfo-Daten lesen:
  SHGetFileAttributes Path, 0, Mem(1), 352, SHGFI_ATTRIBUTES

  'Flag auslesen:
  HasSubdir = CBool(Mem(3) And SFGAO_HASSUBFOLDER)
End Function

© Jost Schwider, 27.06.2001-27.06.2001 - http://vb-tec.de/subdir.htm