Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 23

Thema: problem beim auslesen eines ordners

  1. #1
    TP-Senior
    Registriert seit
    Nov 2003
    Ort
    Graz
    Beiträge
    238

    problem beim auslesen eines ordners

    hi!

    ich möchte alle dateien eines ordners auslesen lassen. dazu habe ich folgenden code benutzt:

    PHP-Code:
    <?php
    $handle 
    opendir ("pics/skaten/");
    while (
    $eintrag readdir($handle))
    {
    echo 
    "$eintrag<br>";
    }
    closedir($handle);

    ?>
    dadurch wird mir jetzt der gesamte inhalt des ordners angezeigt auch die weiteren unterordner. weiters gibt mir das script einen . und ein .. aus. jetzt habe ich versucht das ganze mit einer if schleife zu filtern. und zwar so:

    PHP-Code:
    <?php
    $handle 
    opendir ("pics/skaten/");
    while (
    $eintrag readdir($handle))
    {
    if (
    is_file($eintrag))
        {
        echo 
    "$eintrag<br>";
        }
    }
    closedir($handle);

    ?>
    ergebnis davon ist dass mir das scirpt jetzt nur mehr die datei Thumb.db anzeigt obwohl in dem ordner massenhaft unterordner bilder videos txt dateien usw sind.

    irgendwie verstehe ich nicht ganz warum mir nur die datei Thumb.db ausgegeben wird. aber ich bin mir sicher ihr könnt mir helfen!!

    lg
    skaterpunk

  2. #2
    TP-Specialist Avatar von theo
    Registriert seit
    Apr 2002
    Ort
    743, evergreen terrace
    Beiträge
    2.346
    PHP-Code:
    if (!is_dir($eintrag)) { 
    oder
    PHP-Code:
    if ($eintrag != "." || $eintrag != "..") { 
    /b{2}|[^(bb)]/

    [Workshop] Nested sets

  3. #3
    TP-Specialist Avatar von theo
    Registriert seit
    Apr 2002
    Ort
    743, evergreen terrace
    Beiträge
    2.346
    besser man liest erst alles, bevor man antwortet.

    mit den beiden ansaetzen oben schliesst du die verzeichnisse aus. wenn du aber in dem verzeichnis ne menge andere datentypen liegen hast, dann kommst du um ein kleines reg-exp nicht herum.
    PHP-Code:
    if (eregi("(.jpg|.png|.bmp|.gif)"$ergebnis)) { 
    das sollte nur die bilder herausfiltern.

    gruss
    hardy
    /b{2}|[^(bb)]/

    [Workshop] Nested sets

  4. #4
    TP-Senior
    Registriert seit
    Jan 2005
    Beiträge
    147
    Also ich habe das mal so gemacht...

    PHP-Code:
      $vz opendir($verzname);
      while( 
    gettype($datei readdir$vz))!= boolean )
      {
        if ( 
    strlen($datei) > )
        {
          
    $array[] = $datei;
          
        }
      }
      
      
    closedir($vz); 

  5. #5
    321
    321 ist offline
    TP-Specialist Avatar von 321
    Registriert seit
    Nov 2004
    Ort
    Die Insel in Europa die aus Europa erst Europa macht _________________________ Nähe Lenzburg
    Beiträge
    4.248
    Warum Theo? Er will ja nur Punkt und PunktPunkt ausschliessen.

    Aber hier hast Du einen kleinen Denkfehler:
    PHP-Code:
    if ($eintrag != "." || $eintrag != "..") { 
    bei not x OR not y trifft die Bedingung immer zu!
    [321 Name="Joe"]
    wie immer, lieber gleich mit notepad, dem Editor meines Vertrauens
    [/321]


    use my HTML-Tester

    Motto'06: Mut zur deutschen Sprache!

  6. #6
    TP-Specialist Avatar von theo
    Registriert seit
    Apr 2002
    Ort
    743, evergreen terrace
    Beiträge
    2.346
    hatte ich doch vorhin glatt uebersehen!!!
    Zitat Zitat von skaterpunk001
    ... mit einer if schleife zu filtern. ...
    www.if-schleife.de

    @321: na klasse! und warum ist mit das bei all den bildergalerien noch nie aufgefallen?!
    danke fuer den tip. sollte man wissen ...
    irgendwie hab ich das wort thumb gelesen und mal wieder an fruehere probleme beim auslesen von bildern fuer thumbnails gedacht ... und dementsprechend geschrieben. dann also zurueck zu variante 1

    hardy
    /b{2}|[^(bb)]/

    [Workshop] Nested sets

  7. #7
    TP-Senior
    Registriert seit
    Nov 2003
    Ort
    Graz
    Beiträge
    238
    irgendwie funktioniert das bei mir nicht... kann es sein dass bei meiner php version etwas falsch eingestellt ist?? oder kann es sein dass ich etwas bei den dateiberechtigungen umstellen muss damit php die dateien richtig ausliest??

    oder vielleicht liegts einfach nur daran dass ich den code nicht 100%ig verstehe ich hab den code einfach von einem php buch rausgenommen...
    also im Buch sieht der code so aus:
    PHP-Code:
    $handle opendir ("/apache/htdocs");
    while (
    $eintrag readdir($handle)) /*die Zeile versteh i irgendwie net... zu dem Zeitpunkt gibts die Variable $eintrag doch no garnet oder? und wie kann ich sie dann mir readdir($handle) vergleichen??*/
    {
    if (
    is_file($eintrag))
        {
        echo 
    "$eintrag<br>";
        }
    }
    closedir($handle); 
    theo hat mir dann geraten in der if-ABFRAGE einfach
    PHP-Code:
    if (!is_dir($eintrag)) { 
    zu verwenden, aber wieso sollt da ein anderes ergebnis kommen als bei
    PHP-Code:
    if (is_file($eintrag)) 
    vielleicht kann mir das alles ja jemand EINFACH erklären, irgendwie blick ich da grad voll nicht durch

  8. #8
    TP-Specialist Avatar von theo
    Registriert seit
    Apr 2002
    Ort
    743, evergreen terrace
    Beiträge
    2.346
    vielleicht liegt es auch am wetter. also hier regnet es wie verrueckt!

    zuerst oeffnest du dein verzeichnis, damit du lesen kannst. dann liest du in einer schleife (diesmal wirklich) die dateien aus (die zeile, die du nicht verstehst).
    die frage nach den abfragen is janz einfach:

    is_file() fragt eigentlich, ob der inhalt der variable eine datei ist.

    !is_dir() prueft, ob es sich bei dem inhalt der variable nicht (das "!") um ein verzeichnis handelt.

    letztlich sollte sie zweite abfrage "unsensibler" sein, also mehr objekte durchs netz schluepfen lassen.

    reicht das?

    gruss
    hardy
    /b{2}|[^(bb)]/

    [Workshop] Nested sets

  9. #9
    TP-Senior
    Registriert seit
    Nov 2003
    Ort
    Graz
    Beiträge
    238
    @theo
    danke für deine antwort. wenn ich des richtig verstanden hab sollte das ergebnis von is_file() und !is_dir() aber schon ähnlich sein, weil was kein ordner is muss doch eine datei sein und was keine datei is muss ein ordner sein oder unterscheidet php da zwischen mehreren sachen??

    was ich bei der schleife nicht ganz versteh ist der vergleich:
    PHP-Code:
    ($eintrag readdir($handle
    also ich versteh das so:
    solange $eintrag gleich ist wie das eingelesene verzeichnis wird die while-schleife durchlaufen. aber was steht in den variable $eintrag readdir($handle) eigentlich drinnen?

  10. #10
    TP-Specialist Avatar von theo
    Registriert seit
    Apr 2002
    Ort
    743, evergreen terrace
    Beiträge
    2.346
    also von der sache her muessten die ergebnisse der beiden abfragen aehnlich sein. aber ich hatte irgendwann schon mal aehnliche probleme beim auslesen von verzeichnissen und bin mit der negierten frage nach den verzeichnissen besser gefahren.
    ich wuerde es also eher mit erfahrung als mit logik begruenden wollen. vielleicht koennen, falls es wirklich unterschiede geben sollte, jan oder steffen was dazu sagen.

    was die while-schleife angeht, so liegst du etwas falsch. das ist kein vergleich. wenn es, wie du annimmst, ein vergleich auf gleichheit waere, dann muesste dort ein "==" stehen.
    die sache ist die: die anweisung einer while-schleife laesst die schleife so lange laufen, wie das ergebnis der anweisung wahr (true) ist.
    in diesem falle werden die elemente eines verzeichnisses in der schleife ausgelesen. und ich wuerde die anweisung so interpretieren:
    die anweisung ist so lange wahr, wie objekte an die variable $eintrag uebergeben werden koennen. hat die schleife das letzte objekt im ordner ueberschritten wird das ergebnis der anweisung false und damit das abbruchkriterium erreicht. damit wird der inhalt der schleife (deine if-anweisung) nicht mehr ausgefuehrt.

    etwas verstaendlicher?

    hardy
    /b{2}|[^(bb)]/

    [Workshop] Nested sets

  11. #11
    TP-Senior
    Registriert seit
    Nov 2003
    Ort
    Graz
    Beiträge
    238
    hab mir jetzt angeschaut was die funktion readdir() genau macht und mit deiner erklärung hab ich jetzt verstanden um was es geht...
    das auslesen funktioniert zwar immer noch nicht aber des werd ich schon noch hinbekommen

  12. #12
    TP-Specialist Avatar von theo
    Registriert seit
    Apr 2002
    Ort
    743, evergreen terrace
    Beiträge
    2.346
    ich hab dein script noch mal schnell getestet und so sollte es klappen:
    PHP-Code:
    $handle opendir ("apache/htdocs/"); 
    while (
    $eintrag readdir($handle))  { 
       if (!
    is_dir($eintrag))  { 
        echo 
    $eintrag."<br>"
       } 

    closedir($handle); 
    hardy
    /b{2}|[^(bb)]/

    [Workshop] Nested sets

  13. #13
    TP-Special Mod Avatar von steffenk
    Registriert seit
    Feb 2005
    Ort
    Haan / NRW
    Beiträge
    12.869
    Vielleicht hilft es Dir ja, wenn ich es nochmal mit anderen Worten beschreibe.

    Du willst ein Verzeichnis auslesn. OK.
    Dann wollen wir mal das Verzeichnis öffnen:

    $handle=opendir('Verzeichnis');

    Im $handle steht jetzt ein Zeiger auf das Verzeichnis.
    Damit kannst Du zwar nicht viel anfangen, aber die PHP Verzeichnisfunktionen benötigen diesen Zeiger, um mit dem Verzeichnis was anzufangen.

    Du wolltest es auslesen - dazu gibt es die praktische Funktion readdir()

    Diese Funktion liefert Dir den jeweils nächsten Eintrag in diesem Verzeichnis.
    Ein Aufruf
    $file=readdir($handle);
    würde Dir also den ersten Eintrag in diesem Verzeichnis liefern. Das praktische ist, das diese Funktion sich diesen Eintrag merkt und Dir beim nächsten Aufruf den nächsten Eintrag liefert.
    Jetzt weisst Du ja nicht, wieviele Einträge in dem Verzeichnis sind. Sind alle Einträge ausgelesen, liefert Dir diese Funktion ein FALSCH (also 'false').

    Es ist also sinnvoll, dies in einer Schleife zu tun, bis eben die Rückgabe false ist.
    Dazu eignet sich die while-Schleife:

    while(Ergebnis ungleich false) {
    ...
    }

    Jetzt brauchen wir nur noch den Ausdruck für while:
    false !== ($file = readdir ($handle))

    Das heist, die Funktion readdir wird aufgerufen und das Ergebnis in $file gespeichert. Liefert die Funktion am Ende false, steht da:

    false !== false

    und das ist falsch, die while-Schleife wird verlassen.

    Wunderbar, Du bekommst also alle Einträge des Verzeichnisses, hier nochmal im Zusammenhang:

    PHP-Code:
    while( false !== ($file readdir ($handle)) ) {
       echo 
    "Eintrag: $file <br>";

    So weit, so gut. Jetzt wollen wir die Einträge . und .. nicht sehen, also:

    PHP-Code:
    while( false !== ($file readdir ($handle)) ) {
       if (
    $file != '.' && $file != '..') {
          echo 
    "Eintrag: $file <br>";
       }

    Du kannst das noch ausweiten, z.B.
    PHP-Code:
    while( false !== ($file readdir ($handle)) ) {
       if (
    $file != '.' && $file != '..') {
          if (
    is_dir($file)) {
             echo 
    "Verzeichnis: $file <br>";
          } else {
             echo 
    "File: $file <br>";
          }
       }

    In diesem Sinne sollte es Dir möglich sein, die für Dich wichtigen Informationen anzuzeigen oder weiter zu verarbeiten.

    Ich hoffe, das das jetzt noch verständlicher ist

    TYPO3 · MySQLDumper · dislabs
    ·
    manche Mühlen mahlen schneller ...
    "Ich habe Rücken"
    Horst Schlämmer

  14. #14
    DSB
    DSB ist offline
    TP-Veteran Avatar von DSB
    Registriert seit
    Mar 2005
    Ort
    Weyhe
    Beiträge
    1.137
    Zitat Zitat von skaterpunk001
    was ich bei der schleife nicht ganz versteh ist der vergleich:
    PHP-Code:
    ($eintrag readdir($handle
    also ich versteh das so:
    solange $eintrag gleich ist wie das eingelesene verzeichnis wird die while-schleife durchlaufen. aber was steht in den variable $eintrag readdir($handle) eigentlich drinnen?
    Nicht ganz.
    Das ist ein häufig gemachter Denkfehler und auch gern von mir gemachter Tippfehler.
    Man muss streng unterscheiden:
    - ein Gleichheitszeichen ist ein Zuweisungsoperator!!
    - zwei Gleichheitszeichen sind ein Vergleich !!!

    Die Funktion readdir liest aus dem Dateizeiger ($handle) den nächsten Eintrag aus und speichert das Ergebnis (nämlich den Dateinamen) danach in der Variablen $eintrag als Zeichenkette. Hier findet also die Zuweisung an die Variable statt.

    Danach verkürzt sich der Eintrag also auf if ($eintrag).
    Steht etwas in $eintrag drin, so ist das Ergebnis der If-Abfrage "wahr" und der Schleifenrumpf wird betreten - liefert readdir als Ergebnis "false", dann wird die Schleife ordnungsgemäß verlassen.
    Gruß, DSB
    Einfaches Backup/ Restore Deiner MySQl-Datenbank
    Zend Certified Engineer PHP5

  15. #15
    TP-Senior
    Registriert seit
    Nov 2003
    Ort
    Graz
    Beiträge
    238
    danke für eure ausführlichen erklärungen... jetzt verstehe ichs zumindest.

    ich hab mir jetzt den code von steffen genommen. funktioniert wirklich prima aber nur wenn man bei $handel den ordner angibt in dem das php script selber liegt. gib ich im $handel zB den übergeordneten ordner oder irgendeinen anderen ordner an in dem das php script nicht liegt werden ordner und dateien nicht mehr richtig erkannt plötzlich ist alles ein file.
    das script ist immer gleich warum funktioniert es, wenn ich es den ordner auslesen lasse in dem es liegt und bei allen anderen ordnern nicht??
    damit nicht alle glauben ich bin bescheuert habe ich einen screenshot von ordner und php ausgabe angehängt.

    hoffe ihr könnt mir da auch noch weiterhelfen.
    danke schon mal
    lg
    Angehängte Grafiken Angehängte Grafiken  

Seite 1 von 2 12 LetzteLetzte

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51