Seite 2 von 3

Verfasst: 19.12.2005 15:12
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

IsEmptyDir für PB 4.01

Verfasst: 12.12.2006 01:53
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

Verfasst: 12.12.2006 08:29
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.

Verfasst: 12.12.2006 17:39
von scholly
Danke,
ich hatte still und heimlich gehofft, daß jemand mit einer Verbesserung käme :wink:

Verfasst: 12.12.2006 18:10
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

Verfasst: 12.12.2006 19:50
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:

Verfasst: 12.12.2006 20:05
von AND51
Machst du dich über mich lustig?

Verfasst: 13.12.2006 12:29
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:

Verfasst: 13.12.2006 13:13
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.

Verfasst: 13.12.2006 14:14
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.