Dateianzahl in Ordner (ohne Unterordner) bestimmen, need Help :(

  • Ersteller PowerShellAdmin
  • Erstellt am
P

PowerShellAdmin

Guest
Hi Zusammen,
ich arbeite zur Zeit an einem recht detaillierten Skript zur Ordner-Überwachung und es läuft auch großteils alles sauber.

Nun habe ich ein Problem im folgenden Skript.
Er zählt mir den Ordner richtig durch, nur Sobald Ordner ein unter Ordner ist, sagt er mir 0 ...
Wie kann ich den Ausschnitt ergänzen das er ausschließlich Dateien durchzählt und nur im $path angegebenen Verzeichnis UND eben nicht ins Unterverzeichnis springt :/

Wäre um eine Idee dankbar, denke das ist nichts so großes.

MFG Johnny

PHP:
$i = 0;
$dir = opendir($path);
while(readdir ($dir))
{
	
 $i++; 

};

closedir($dir);

echo "\nDateien gefunden: ".$i;
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
warum schreibst du eigtl alle scripte in php? bash oder sowas ist doch teils einfacher:
aber nun denn, allerdings ungetestet:
PHP:
$i = 0;
$dir = opendir($path);
while($file=readdir ($dir))
{
 if(!is_dir($path."/".$file)
     $i++; 

};

closedir($dir);

echo "\nDateien gefunden: ".$i;
 
Zuletzt bearbeitet:
warum schreibst du eigtl alle scripte in php? bash oder sowas ist doch teils einfacher:
aber nun denn, allerdings ungetestet:
PHP:
$i = 0;
$dir = opendir($path);
while(readdir ($dir))
{
 if(!is_dir($path."/".$dir)
     $i++; 

};

closedir($dir);

echo "\nDateien gefunden: ".$i;

hi,
danke werde es gleich mal testen.
mit batch, also dos cmds hatte ich mich nie intensiv befasst. die dateizählung ist wirklich nur ein auszug, der skript ist ein guter 3seiter.

wieso php ?
es wird mit unter auch eine email html formatiert mit styles verschickt, und ich weiß nicht wie sich eine cmd bei so vielen schleifen und anweisungen verhält.

php ist mir sehr sehr sympatisch, da es so an c anliegt :) und mir die saubere struktur so gut gefällt.

mfg & thx
 
btw ich hab das script eben noch mal angepasst... nimm mal das aktuelle ;)

gut würdest du unter linux arbeiten, wäre die bash um einiges performanter als php, aber unter windows gut, da kann mans noch so "halb" verstehen, auch wenn es sicherlich bessere lösungen gibt.
 
performanter sind beide nicht. PHP und Batch sind nicht kompiliert und damit verlieren sie das Rennen gegen alle anderen ausführbaren Programme wie zum Beispiel C++.

Es kommt nicht auf die Sprache an sondern auf die Schleifenkonstruktionen und die IF-Anweisungen. Ich kann dir in beiden Sprachen das gleiche Programm schreiben nur eben mit unterschiedlichen IF-Bedingungen und damit das Ergebniss von vornerein manipulieren.

Allgemeinse Aussagen wie "ist performanter" stimmen sowieso meist nicht. Jede Programmiersprache hat ihre Stärken und Schwächen. Vergleicht man Java mit VB.Net, dann sieht man, dass beide Programmiersprachen gleich schnell sind aber Java eben in bestimmen bereichen Langsamer und in anderen Bereichen wiederum schneller ist. Gleiches gilt für den Vergleich von PHP und Batch. Batch ist nicht performanter als PHP.
 
mag schon sein, aber unter linux wäre eine pipe konstrution sicher schneller.
ich weiß jetzt den genauen befehlsstring nicht, aber wenn man in etwa sowas wie: "ls -la | wc" schreibt, und das auf ein verzeichnis mit mehreren hundert dateien anwendet, wird es wohl schneller sein als php.
 
Da bin ich mir nicht sicher. Bash macht an der Stelle auch nichts anderes als PHP. Ich kann mir in PHP auch 2 Funktionen schreiben. Die erste gibt mir alle Datein zurück und die 2. Zählt sie. Dann hätte ich genau das gleiche wie in Bash. Wie die beiden von dir genannten Bash Funktionen genau arbeiten weiß ich nicht aber ich kann mir gut vorstellen, dass die 1. Funktion alle Datein raussucht und das Ergebniss der 2. Funktion übergibt, die dann in einer Schleife alle Zeilen durchzählt. Ist doch genau das gleiche. Lass dich nicht vom äußeren Erscheinungsbild täuschen.

In Bash ist der Befehl zwar kleiner aber ob es desshalb schneller ist kann ich nicht beurteilen. Das sollte mich jetzt aber nicht abschrecken und ich behaupte einfach wie du, dass PHP sicher schneller ist :)
 
Zuletzt bearbeitet:
ls und wc sind beides compilierte ausführbare dateien, also keine scripte.
wc "zählt" und ls -la oder wie auch immer gibt den inhalt eines verzeichnisses aus und ist auch eine ausführbare compilierte datei. ich weiß allerdings nicht ob man ls soweit restricten kann, dass er nur verzeichnisse anstatt allem ausgibt.
 
Ich kenne die Befehle. Ich weiß was sie machen sollen aber eben nicht wie sie es machen.

Wenn du so willst ist opendir das gleiche wie ls -la. Ist opendir etwa nicht kompiliert? Wir reden hier von einer Zeit im ms bereich. Kannst du da behaupten, dass Bash sicher schneller ist? Und wie schnell ist sicher schneller? Dauert es dann nur halb so lange? Wie hast du das gemessen?
 
hey so...

erst einmal ot:
ich bin im administrationsbereich tätig und die skripterei/programmiererei ist nur ein kleines hobby. habe dafür einfach nicht genügent zeitreserven-
php hat sich ergeben, da es e in einfaches frontend via html bietet und ich schon paar erfahrungen in php habe... liegt aber 8mon zurück und ich mache schwerpunkt andern kram...
ich mag einfach die struktur. mit java etc kann ich nichts anfangen.

bt:
bleibt bitte bei php und konstruktiv :)kritik ist natürlich auch sehr gerne gesehen, bestmöglich mit einer hinführung zu besseren wegen.


die performance sollte vernachlässigbar sein, wie geschrieben oben dies istn ur ein kleiner auszug des gesamten und die leistungeines solchen ablaufs ist relativ gering. da die schleifen ne 10min pause nach durchlauf haben...


dein skript konnte ich leider nicht richtig ausprobieren da beim kunden nen mailsrv die krätsche machte....
hatte es nur kurz angetestetz und da war keine verbesserung zu sehen,in der ersten vs den klammerfehler hatte ich bemerkt..

für was steht das ! ? wolltest du ein boolisches false o. was damit in der überprüfung der if-anweisung ? :-)

......................................................................................................

kann ich mit php eigentlich eine bin datei nach einem bestimmten binärwert durchsuchen ? (interesse nur erstmal prinzipiell)
 
das ! steht fuer verneinung, also das er aus nem true nen flase macht. weil wenn das file nen dir ist dann braucht er es nicht mitzaehlen, und ansonsten haett ich ja if(){}eles{ $zahl++; } machen muessen, und so war es halt kuerzer
 
ok, allerdings hilft das im kern leider noch nicht.

das problem ist, er zählt mir sobald der unterordner drinne ist nicht mehr richtig durch. das ganze läuft lokal aufm 2003 server.
zeigt mir so z.b. nur immer 2 an und ende, sobald ich den unterordner entferne zählt er korrekt durch.

hatte heute auch etwas im inet gegooglet aber nicht konkretes gefunden, im bezug zu problematik.
muss jetzt erstmal mein os sichern ... (vista64bit zu winxp64bit back) =)
 
Hier heissen die Zauberworte "Globale Variablen" und "Rekursiv Funtkion"

Globale Variablen stehen im gesamten Script zur Verfügung, auch in Funktionen.

Eine Rekursivfunktion ist eine Funktion die sich selbst nochmals aufrufen kann.

Eine andere Möglichkeit fällt mir jetzt gerade nicht ein, wie man Dateien in Ordner und deren Unterordner zählen kann.
Diese aber funktioniert.

PHP:
<?php
function ReadMyDir($my_dir){
	if ($handle = opendir($my_dir)) {
	    while (false !== ($file = readdir($handle))) {
	        if ($file != "." && $file != "..") {
	        		if(is_file($file) OR is_file($my_dir."/".$file)) {
	        			$GLOBALS["dateien"]++;
	        			$GLOBALS["groesse"] = $GLOBALS["groesse"] + filesize($my_dir."/".$file);
	        		}
	        		if(is_dir($file) OR is_dir($my_dir."/".$file)) {
	        			$GLOBALS["ordner"]++;
	        			ReadMyDir($my_dir."/".$file);        			
	        		}
	        }
	    }
	    closedir($handle);
	}
}

global $groesse, $dateien, $ordner, $my_dir;
ReadMyDir('.');

echo "<br> Größe: ".round((($GLOBALS["groesse"]/1024)/1024),0)." MB (".number_format($GLOBALS["groesse"])." Bytes)";
echo "<br> Dateien: ".$GLOBALS["dateien"];
echo "<br> in Ordnern: ".$GLOBALS["ordner"];
?>

Edit.

Jetzt hab ich da was total falsch verstanden,
ich denke das was du willst ist so ein Script:
PHP:
if ($handle = opendir('.')) {
	while (false !== ($file = readdir($handle))) {
		if ($file != "." && $file != "..") {
			if(is_file($file)) {
				$dateien++;       
			}
		}
	}
	closedir($handle);
}
echo $dateien;
 
Zuletzt bearbeitet:
Leben wir noch im Steinzeitalter, dass wir Globals benutzen?
Jede gute PHP-Konfiguration unterbindet die Verwendung von vorherein.

@FunkyPunk: Schau dir mal DirectoryIterator aus der SPL (Standard PHP Library).
Damit kannst du deine 3 Seiten fix auf eine reduzieren.
Arbeitet sich auch leichter, mit den Objekten...
 
hey, danke für das weitere feedback. zurzeit brauche ich mal etwas abstand von der arbeit :) werde euch nach ostern mitteilen wie es nun und ob funktioniert.

übrigens ergeben sich die 3 seiten nicht durch das durchzählen, sondern hauptsächlich durch das reagieren.

frohe ostern :-)
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh