Seite 1 von 1
Wie leere Verzeichnisse finden?
Verfasst: 02.02.2025 11:55
von EmmJott
Guude Morsche!
Bastle gerade an einer Routine, die leere Verzeichnisse finden soll. Die Prüfung sieht ungefähr so aus:
Code: Alles auswählen
While NextDirectoryEntry(dir)
filename = DirectoryEntryName(dir)
If filename = "." Or filename = ".." Or DirectoryEntryType(dir) = #PB_DirectoryEntry_File Or DirectoryEntryType(dir) = #PB_DirectoryEntry_Directory
; Verzeichnis nicht leer
Continue
Else
; und so weiter
EndIf
Wend
Meine Frage: Finde ich damit wirklich ausschließlich leere Verzeichnisse oder werden auch Verzeichnisse als "leer" erkannt, für deren Inhalt Zugriffs-/Leserechte fehlen?
Re: Wie leere Verzeichnisse finden?
Verfasst: 02.02.2025 13:09
von NicTheQuick
Du kannst es doch einfach ausprobieren.
Schau dir auch noch `DirectoryEntryAttributes()` an. Je nach Betriebssystem musst du da eine Unterscheidung einbauen.
Bei Linux und Mac ist es so, dass wenn ein Verzeichnis nicht die Execute-Rechte hat, dann kann man seinen Inhalt nicht auflisten. Was du allerdings nicht mit Purebasic direkt abfragen kannst, sind erweitere Rechte mit ACLs.
Re: Wie leere Verzeichnisse finden?
Verfasst: 02.02.2025 13:41
von EmmJott
Hi,
Danke für Dein Feedback. In meinem Fall geht es nur um Windows und auch nur um interne Laufwerke und/oder USB-Laufwerke. Also z. B. nicht um Netzwerklaufwerke oder ähnliches.
Verstehe den Sinn einer Prüfung mit `DirectoryEntryAttributes()` dabei nicht. Wenn die Anwesenheit einer Datei (oder eines anderen Unterverzeichnisses) erkannt wird, dann ist es doch für die Feststellung, dass das Verzeichnis nicht leer ist, unerheblich, welche Attribute eine gefundene Datei (bzw. ein Verzeichnis) hat - oder bin ich da auf dem Holzweg?
Meine Frage geht eher in die Richtung, ob DirectoryEntryType() immer alle Verzeichnisinhalte findet oder ob es fehlende Leserechte geben kann, die ein Verzeichnis nur leer erscheinen lassen?
Re: Wie leere Verzeichnisse finden?
Verfasst: 02.02.2025 15:33
von Axolotl
Moin EmmJott,
ich denke Du musst es wohl mit (eigenen) Ordnern ausprobieren.
Eventuell hilft Dir dabei der Befehl "icacls" weiter.
BTW: ich würde die Überprüfung wohl so machen:
Code: Alles auswählen
Procedure IsFolderEmpty(Pathname.s) ; returns #False or #True
Protected ND, result
result = #False
ND = ExamineDirectory(#PB_Any, Pathname, "")
While NextDirectoryEntry(ND)
If DirectoryEntryType(ND) = #PB_DirectoryEntry_File
result = #True : Break
Else
If DirectoryEntryName(ND) <> "." And DirectoryEntryName(ND) <> ".."
result = #True : Break
EndIf
EndIf
Wend
FinishDirectory(ND)
ProcedureReturn result
EndProcedure
Re: Wie leere Verzeichnisse finden?
Verfasst: 07.02.2025 16:50
von SMaag
hier der funktionierende Beispielcode für das Listen leerer Verzeichnisse.
wenn du den ganzen Satz der FileSystemFunktionen brauchst. ListFiles, ListDirectories .. dann
https://github.com/Maagic7/PureBasicFra ... eSystem.pb
Code: Alles auswählen
Procedure.i ListEmptyDirectories(Dir$, List lstDirs.s())
; ===========================================================================
; NAME : ListEmptyDirectories
; DESC : List Empty Directories starting at Basedirectory = Dir$
; DESC :
; VAR(Dir$) : Start Directory
; VAR(List lstDirs()) : List() to hold the DirectoryNames
; RET.i : Number of found empty Directories
; ===========================================================================
Protected NewList tmp_lstDir.s() ; internal temporary DirectoryList
Protected hDir, xEmpty
AddElement(tmp_lstDir())
tmp_lstDir()=Dir$
ClearList(lstDirs())
While ListSize(tmp_lstDir())
FirstElement(tmp_lstDir())
Dir$=tmp_lstDir()
hDir=ExamineDirectory(#PB_Any,Dir$, "")
If hDir
;Debug Dir$
xEmpty = #True
While NextDirectoryEntry(hDir)
If DirectoryEntryType(hDir)=#PB_DirectoryEntry_File
; not Empty
xEmpty = #False
;Debug Dir$
Else ; Directory
Select DirectoryEntryName(hDir)
Case ".", ".."
; ignore
Default
AddElement(tmp_lstDir())
tmp_lstDir()=Dir$ + #PS$ + DirectoryEntryName(hDir)
xEmpty = #False
; Break
EndSelect
EndIf
Wend
FinishDirectory(hDir)
If xEmpty
AddElement(lstDirs())
lstDirs() = Dir$ ; tmp_lstDir()
Debug Dir$
EndIf
EndIf
FirstElement(tmp_lstDir())
DeleteElement(tmp_lstDir())
Wend
ProcedureReturn ListSize(lstDirs())
EndProcedure
Define NewList lstDirs.s()
Define cntDirs
Define BaseDir$
Define I, res, t1, t2, t3
BaseDir$ ="D:\" ; Temp"
; BaseDir$ ="C:\Windows"
OpenConsole("List Empty Directories in : " + BaseDir$)
t1 = ElapsedMilliseconds()
cntDirs = ListEmptyDirectories(BaseDir$, lstDirs())
t1 = ElapsedMilliseconds() - t1
ForEach lstDirs()
PrintN(lstDirs())
Next
PrintN(#Null$)
PrintN("Time to list empty Directories = " + Str(t1) + "ms")
PrintN(Str(cntDirs) + " Empty Direcories found!")
PrintN(#Null$)
PrintN("Press any key to exit!")
Input()