vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Dateisystem · Ordner & Verzeichnisse   |   VB-Versionen: VB2008, VB2010, VB201213.11.13
Ist ein Verzeichnis leer?

Eine Routine zur schnellen Überprüfung, ob ein Ordner Unterordner oder Dateien enthält (Nutzung von Windows-APIs)

Autor:   Manfred BohnBewertung:  Views:  7.601 
ohne HomepageSystem:  Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

Die Frage, wie man effizient überprüfen kann, ob ein Ordner leer ist, wird hier diskutiert:
http://stackoverflow.com/questions/755574/how-to-quickly-check-if-folder-is-empty-net

Der folgende Code gehört in ein Standard-Modul, das den Namespace "System.Runtime.InteropServices" importiert.

Die Funktion "IsDirectoryEmpty" erwartet den Pfad des zu prüfenden Ordners.

Private ReadOnly INVALID_HANDLE_VALUE As New IntPtr(-1)
 
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
Private Structure WIN32_FIND_DATA
  Public dwFileAttributes As UInteger
 
  Public ftCreationTime As System.Runtime.InteropServices.ComTypes.FILETIME
  Public ftLastAccessTime As System.Runtime.InteropServices.ComTypes.FILETIME
  Public ftLastWriteTime As System.Runtime.InteropServices.ComTypes.FILETIME
 
  Public nFileSizeHigh As UInteger
  Public nFileSizeLow As UInteger
  Public dwReserved0 As UInteger
  Public dwReserved1 As UInteger
 
  <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _
  Public cFileName As String
 
  <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=14)> _
  Public cAlternateFileName As String
End Structure
 
<DllImport("kernel32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
Private Function FindFirstFile(ByVal lpFileName As String, _
  ByRef lpFindFileData As WIN32_FIND_DATA) As IntPtr
End Function
 
<DllImport("kernel32.dll", CharSet:=CharSet.Auto)> _
Private Function FindNextFile(ByVal hFindFile As IntPtr, _
  ByRef lpFindFileData As WIN32_FIND_DATA) As Boolean
End Function
 
<DllImport("kernel32.dll")> _
Private Function FindClose(ByVal hFindFile As IntPtr) As Boolean
End Function
''' <summary>Enthält der Ordner mindestens einen Unterordner oder eine Datei?</summary>
''' <param name="path">der zu prüfende Ordner</param>
Public Function IsDirectoryEmpty(ByVal path As String) As Boolean
 
  If String.IsNullOrEmpty(path) Then
    Throw New ArgumentNullException(path)
  End If
 
  If IO.Directory.Exists(path) Then
    If path.EndsWith(IO.Path.DirectorySeparatorChar.ToString()) Then
      path += "*"
    Else
      path += IO.Path.DirectorySeparatorChar + "*"
    End If
 
    Dim findData As New WIN32_FIND_DATA
    Dim findHandle As System.IntPtr = FindFirstFile(path, findData)
 
    If findHandle <> INVALID_HANDLE_VALUE Then
      Try
        Dim empty As Boolean = True
        Do
          If findData.cFileName <> "." AndAlso _
            findData.cFileName <> ".." Then
            empty = False
          End If
        Loop While empty And FindNextFile(findHandle, findData)
 
        Return empty
      Finally
        FindClose(findHandle)
      End Try
    End If
 
    Throw New System.Exception("Failed to get directory first file", _
      Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error()))
 
  End If
  Throw New IO.DirectoryNotFoundException()
End Function



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.