prüfen ob Ordner leer ist

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
sen-me
Beiträge: 478
Registriert: 17.07.2005 16:02
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag von sen-me »

ich wollt ne seach funktion baun die leere ordner und 0 byte datein erkennt und in eine liste (NewList files.files()) schreibt
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

IsEmptyDir für PB 4.01

Beitrag von scholly »

Ich brauchts heute mal wieder und wenn ich noch nicht schlaftrunken bin, sollte das hier gehen:

Code: Alles auswählen

Procedure.l IsEmptyDir(Dir$)
  Protected DirElement.l                   
                                            
  Protected wasgefunden.s 
 
  ExamineDirectory(0, Dir$, "*.*")          
  DirElement = NextDirectoryEntry(0)        
 
  While direlement <> 0                      
    If DirectoryEntryType(0) = #PB_DirectoryEntry_File
      wasgefunden = "wahr" 
      direlement = 0 
    Else
      If DirectoryEntryName(0) = "."
        wasgefunden = "falsch"
      ElseIf DirectoryEntryName(0) = ".."
        wasgefunden = "falsch"
      Else
        wasgefunden = "wahr"
        direlement = 0
      EndIf
    EndIf
    DirElement = NextDirectoryEntry(0)
  Wend                     

  If wasgefunden = "falsch"
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
  ;(*)
  ; "." und ".." sind Bestandteil eines jeden Verzeichnisses unter Windows.
EndProcedure

; --- Anwendungsbeispiel ---
Dir$ = PathRequester("Verzeichnis wählen", "C:\")

If IsEmptyDir(Dir$)
  MessageRequester("Ergebnis", "Das Verzeichnis " + Dir$ + " ist leer.")
Else
  MessageRequester("Ergebnis", "Das Verzeichnis " + Dir$ + " ist nicht leer.")
EndIf

End
guts nächtle...
scholly
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

für prozeduren ist #PB_ANY empfehlenswert, um konflikte zu vermeiden. außerdem sollte man gucken, ob ExamineDirectory() überhaupt geklappt hat.

Code: Alles auswählen

Procedure dirIsEmpty(path.s)
  Protected res.l
  Protected name.s
  Protected dir.l

  If Right( path, 1) <> "\"
    path+"\"
  EndIf
 
  dir=ExamineDirectory(#PB_Any, path, "*.*")
  If dir
    res=1
    While NextDirectoryEntry(dir) And res
      name=DirectoryEntryName(dir)
      If name <> "." And name <> ".."
        res=0
      EndIf
    Wend
    FinishDirectory(dir)
  EndIf
 
  ProcedureReturn res
EndProcedure


Debug dirIsEmpty("C:\test\empty.dir\")
Debug dirIsEmpty("C:\Windows")
Debug dirIsEmpty("C:\Windows\")
Debug dirIsEmpty("T:\I_am_not\")
Debug dirIsEmpty(" h th6tht öpö tht ht #+#+ 3547")
<eddi:>
hab' noch das fehlende FinishDirectory(dir) ergänzt.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Danke,
ich hatte still und heimlich gehofft, daß jemand mit einer Verbesserung käme :wink:
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Habe noch eine Verbesserung 8)

#Null hat eine Zeile mehr als ich!
Ich habe 16, würde man das Break weglassen, wär es eine Zeile weniger, dann wird aber das ganze Directory bis zum Ende durchsucht!
Die FileSize() Zeile könnte man auch noch weglassen.
  • Meine Funktionen:
  • Hängt \ an, wenn nicht schon geschehen
  • Gibt 0 zurück, wenn Verzeichnis leer
  • Gibt -3 zurück, wenn Verzeichnis doch nicht leer
  • Gibt -1 zurück, wenn 'pfad$' in weder eine Datei noch ein Ordner ist
  • Gibt -2 zurück, wenn 'pfad$' zwar ein gültiger Ordner ist, aber nicht untersucht werden kann
  • Gibt X zurück, wenn 'pfad$' eine Datei ist. X ist dann die Dateigröße in Bytes, weshalb der Rückgabewert der Procedure ein Quad ist
  • Das Break bricht sofort ab, wenn eine Datei gefunden wurde, das spart unter Umständen sehr viel Zeit!

Code: Alles auswählen

Procedure.q isNotEmpty(pfad$)
	If Not Right(pfad$, 1) = "\"
		pfad$+"\"
	EndIf
	Protected dir=ExamineDirectory(#PB_Any, pfad$, ""), empty=0
	If dir
		While NextDirectoryEntry(dir)
			If DirectoryEntryName(dir) <> "." And DirectoryEntryName(dir) <> ".."
				empty=-3
				Break
			EndIf
		Wend
		FinishDirectory(dir)
		ProcedureReturn empty
	EndIf
	ProcedureReturn FileSize(Left(pfad$, Len(pfad$)-1))
EndProcedure




Debug isEmpty("C:\") ; gibt es, NICHT leer
Debug isEmpty("C:\temp") ; gibt es auch, NICHT leer
Debug isEmpty("C:\temp\egal") ; gibt es, >>>LEER<<<
Debug isEmpty("C:\temp\GIBT ES NICHT!!!!") ; gibt es NICHT
Debug isEmpty("C:\pagefile.sys") ; kein gültiger ordner, sondern eine datei
Edit: Verbessert
Zuletzt geändert von AND51 am 13.12.2006 16:45, insgesamt 4-mal geändert.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

__ IsEmpty() ?
_____ YES, äh..naja
__ IS_EMPTY() ??
_____ YES, but, äh no, is not
__ IS_EMPTY() ????
_____ NO, :( , äh, ..#TRUE, but NO, is not empty,

__ ???????

_____ is file.
_____ and file is IsEmpty() bytes groß.
__ ...
_____ :| :cry: :praise:


__ If IsEmpty()=1 And One()=Empty() And Not One()=OneByteFile()
...

:lol:
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Machst du dich über mich lustig?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

#NULL hat geschrieben:__ IsEmpty() ?
_____ YES, äh..naja
__ IS_EMPTY() ??
_____ YES, but, äh no, is not
__ IS_EMPTY() ????
_____ NO, :( , äh, ..#TRUE, but NO, is not empty,

__ ???????

_____ is file.
_____ and file is IsEmpty() bytes groß.
__ ...
_____ :| :cry: :praise:


__ If IsEmpty()=1 And One()=Empty() And Not One()=OneByteFile()
...

:lol:
:bounce: :bounce: :allright: :allright: :allright:
AND51 hat geschrieben:Machst du dich über mich lustig?
:lol: :lol: :bounce: :lol: :lol:
Du machst mich fertig, AND... (deine Frage ist ja...

You've made my day #NULL and AND :lol: :lol: Ich kann nicht mehr xD :roll: :lol: )

*Tränenwegwisch* :allright: :freak:
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
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

Beitrag von NicTheQuick »

@AND51:
Du hast einen Fehler in deiner Procedure.
Wenn die Procedure 1 (= #True) zurückgibt, dann kann es entweder ein
leeres Verzeichnis sein oder eine Datei, die 1 Byte groß ist. Deine Procedure
ist also etwas überladen.
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

entschuldige AND51. :yin-yang:
vollkommener blödsinn ist es ja nicht.
wenn man einen verzeichnis übergibt, erfährt man ob es einträge enthält. und wenn man eine datei übergibt, erfährt man, ob sie leer ist.
verzeichnisse und dateien sind aber verschiedene dinge und gerade in so einem fall würde ich das trennen.
..
ne halt.
geht ja gar nicht. wenn man eine datei übergibt, wird ein backslash angehängt. also nixda, verzeichnis existiert nicht.
und die byte-größe, die du zurückgeben willst, ist nicht die der mit pfad übergebenen datei. sondern einer gefundenen datei innerhalb eben dieses pfads(!).
..stimmt also vorneundhintennicht.
(aber wir dürfen trotzdem freunde bleiben :mrgreen: )

..ne halt (2)
also doch. es ist wirklich so wie NTQ sagte.
if isEmpty()=1
..verzeichnies leer, oder 1 byte große datei drin.


also ich würde eine einfache boolsche antwort bevorzugen.
was anderes wär es bei isNotEmpty() oder so und dem negierten rückgabewert. da kann man dann entscheiden, ob man sich mit mit #true/#false zufrieden gibt, oder ob man den #true-wert weiter untersucht, z.b. "no is not empty, weil verz. gar nicht da" oder "..weil datei drin..".
inwieweit man funktionen auf bool, oder eher auf konkrete werte prüfen muß ist sicher auch geschmackssache und kommt auf die funktion an.
aber funktionieren sollte es dann auf jeden fall.
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten