Wie leere Verzeichnisse finden?

Anfängerfragen zum Programmieren mit PureBasic.
EmmJott
Beiträge: 39
Registriert: 25.10.2024 12:23

Wie leere Verzeichnisse finden?

Beitrag 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?
Bin aktiv in der rentenvorbereitenden Arbeitslosigkeit - zwangsweise. Auch nach >30 Jahren im Betrieb springst Du über die Klinge, wenn der (Miss-)Manager seinen Hintern retten will. Lasst Euch von euren Arbeitgebern bloß nix von wegen Loyalität erzählen - wenn's drauf ankommt, ist die nix Wert!
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Wie leere Verzeichnisse finden?

Beitrag 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.
EmmJott
Beiträge: 39
Registriert: 25.10.2024 12:23

Re: Wie leere Verzeichnisse finden?

Beitrag 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?
Bin aktiv in der rentenvorbereitenden Arbeitslosigkeit - zwangsweise. Auch nach >30 Jahren im Betrieb springst Du über die Klinge, wenn der (Miss-)Manager seinen Hintern retten will. Lasst Euch von euren Arbeitgebern bloß nix von wegen Loyalität erzählen - wenn's drauf ankommt, ist die nix Wert!
Axolotl
Beiträge: 265
Registriert: 31.12.2008 16:34

Re: Wie leere Verzeichnisse finden?

Beitrag 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 
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
SMaag
Beiträge: 184
Registriert: 08.05.2022 12:58

Re: Wie leere Verzeichnisse finden?

Beitrag 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()
Antworten