Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Aktuellstes Datum von Dateien rekursiv ermitteln

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Aktuellstes Datum von Dateien rekursiv ermitteln

    Hallo!

    Ich möchte das aktuellste Datum von Dateien ermitteln. Dazu habe ich mir ein Skript gebastelt, was auch rekursiv alle Unterordner durchsucht. Das funktioniert auch so weit, d.h. ich kann mir alle Zeitstempel der Dateien ausgeben lassen. Jetzt würde ich gerne in eine Variable das aktuellste Datum schreiben. Das funktioniert aber bisher nicht. Kann mir hierbei bitte jemand helfen??

    Hier mein bisheriges Skript:

    PHP-Code:
    <?php

    $arr 
    = array();
    $i 0;

    function 
    get_dir ($dir
    {
      
    $fp=opendir($dir);
      while(
    $file=readdir($fp)) 
      {
        
    // ist Datei ein Verzeichnis -> rekursiver Aufruf um das Verzeichnis auszulesen
        
    if (is_dir("$dir/$file") && $file!="." && $file!=".."
        {
          
    get_dir("$dir/$file"); 
        }
        
    // ist Datei kein Verzeichnis -> ausgeben
        
    else if ((!is_dir("$dir/$file")) && $file!="." && $file!=".."
        {
          
    $temp $dir."/".$file;
          
    //echo "Datei: ".$dir."/".$file." Erstellt: ".date('j.m.Y, H:i', filemtime($temp))."<br>";
          
    $arrDates[] = filemtime($temp);
          
    sort($arrDates);
          
    $arr[i] = max($arrDates);
          
    //echo "i: ".$i."<br>";
          
    $i++;
        }
      }
      
    closedir($fp);
      echo 
    "Test: ".date(' j.m.Y, H:i'max($arrDates))."<br>";

      for (
    $x 0$x sizeof($arrDates); ++$x)
      {
        
    //$ausgabe = date(' j.m.Y, H:i', current($arrDates));
        
    $ausgabe date(' j.m.Y, H:i'$arrDates[$x]);
        echo 
    $ausgabe."<br>";
        
    next($arrDates);
      }
    }

    echo 
    get_dir("./");
    //echo "Test: ".$arr[0]."<br>";

    ?>
    P.S.: In dem Skript sind noch ein paar Zeilen, die natürlich weg können. Ich habe sie nur für meine Tests noch einmal drin gelassen.

    Schon mal vielen Dank!
    Marcus

  • #2
    Zielführend: Sortieralgorithmus (String Abwärtssortierung) in Verbindung mit einem geeigneten Datumsformat, bspw. YYYY-mm-dd HH:mm:ss

    max funktioniert hier nicht, wohl aber der < Operator. Außerdem mußt Du ja nur mit dem bis dato größten Element vergleichen, nie mit einer Liste von Einträgen.

    EDIT
    Ich sehe gerade, Du arbeitest mit dem puren timestamp aus filemtime. Dafür ist max natürlich geeignet. Aber wie gesagt, nicht ins Array schreiben sondern immer nur zwei Werte vergleichen und den größten speichern.
    [COLOR="#F5F5FF"]--[/COLOR]
    [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
    [COLOR="#F5F5FF"]
    --[/COLOR]

    Kommentar


    • #3
      Ich habe mein Skript einmal bearbeitet und die überflüssigen Zeilen gelöscht. Wenn ich mir jetzt das Ergebnis ausgeben lasse, erhalte ich das:

      Test: 14.06.2008, 15:28
      Test: 11.11.2007, 13:54
      Test: 15.06.2008, 20:01
      Test: 0

      Wie kann ich den jeweils größten Wert in eine Variable (globale Variable?) schreiben, damit es auch ausserhalb der Funktion verfügbar ist?

      PHP-Code:
      <?php

      $test
      =0;

      function 
      get_dir ($dir
      {
        
      $fp=opendir($dir);
        while(
      $file=readdir($fp)) 
        {
          
      // ist Datei ein Verzeichnis -> rekursiver Aufruf um das Verzeichnis auszulesen
          
      if (is_dir("$dir/$file") && $file!="." && $file!=".."
          {
            
      get_dir("$dir/$file"); 
          }
          
      // ist Datei kein Verzeichnis -> ausgeben
          
      else if ((!is_dir("$dir/$file")) && $file!="." && $file!=".."
          {
            
      $temp $dir."/".$file;
            if (
      $test<filemtime($temp))
            {
              
      $test=filemtime($temp);
            }
          }
        }
        
      closedir($fp);
        echo 
      "Test: ".date(' j.m.Y, H:i'$test)."<br>";
      }

      echo 
      get_dir("./");
      echo 
      "Test: ".$test."<br>";

      ?>

      Kommentar


      • #4
        Es geht doch um den Max Wert der gesamten Strukur oder? Arbeite einfach mit einem return.
        [COLOR="#F5F5FF"]--[/COLOR]
        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
        [COLOR="#F5F5FF"]
        --[/COLOR]

        Kommentar


        • #5
          Das war es. Es funktioniert nun!
          Vielen Dank!
          Gruß
          Marcus

          Kommentar


          • #6
            Hallo!

            Leider hat es doch noch nicht so funktioniert, wie gewünscht.

            Ich habe aktuell folgende Funktion:

            PHP-Code:
            function get_dir ($dir
            {
              
            $i=0;
              
            $fp=opendir($dir);
              while(
            $file=readdir($fp)) 
              {
                
            // ist Datei ein Verzeichnis -> rekursiver Aufruf um das Verzeichnis auszulesen
                
            if (is_dir("$dir/$file") && $file!="." && $file!=".."
                {
                  
            get_dir("$dir/$file"); 
                }
                
            // ist Datei kein Verzeichnis -> ausgeben
                
            else if ((!is_dir("$dir/$file")) && $file!="." && $file!=".."
                {
                  if(
            $i==0)
                  {
                    
            $temp1=date(' j.m.Y, H:i'filemtime($dir."/".$file));
                  }
                  else if(
            $i>0)
                  {
                    
            //echo "Datei: ".$dir."/".$file." --> Datum: ".date(' j.m.Y, H:i', filemtime($dir."/".$file))."<br>";
                    
            $temp2=date(' j.m.Y, H:i'filemtime($dir."/".$file));      
                    echo 
            "Datei: ".$dir."/".$file."<br>Temp1: ".$temp1." <-> Temp2: ".$temp2."<br>";
                    if(
            $temp1<$temp2)
                    {
                      
            $temp1=$temp2;
                    }
                    echo 
            "Max: ".$temp1."<br>";
                  }
                  
            $i++;
                }
              }
              
            closedir($fp);
              
            //return $temp1;

            Ich habe mir ein paar Ausgaben zur Kontrolle eingebaut. Dabei sieht man, dass beim rekursiven Aufruf (d.h. wenn die gefundene Datei ein Verzeichnis ist) immer der aktuelle max-Wert wieder "vergessen" ist und der max-Wert wieder neu ermittelt wird.

            Bsp.:

            Datei: .//downloads/test1/2.php
            Temp1: 14.06.2008, 15:44 <-> Temp2: 14.06.2008, 15:44
            Max: 14.06.2008, 15:44
            Datei: .//bilder/content.php
            Temp1: 11.11.2007, 13:55 <-> Temp2: 24.02.2008, 16:36
            Max: 24.02.2008, 16:36
            Datei: .//bilder/index.php
            Temp1: 24.02.2008, 16:36 <-> Temp2: 10.11.2007, 12:26
            Max: 24.02.2008, 16:36
            Datei: .//bilder/kurztrips/content.php
            Temp1: 16.03.2008, 16:39 <-> Temp2: 16.03.2008, 16:39
            Max: 16.03.2008, 16:39
            .........

            Kann mir bitte hierbei jemand helfen?

            Danke & Gruß
            Marcus

            Kommentar


            • #7
              Zitat von nikosch77-new Beitrag anzeigen
              in Verbindung mit einem geeigneten Datumsformat, bspw. YYYY-mm-dd HH:mm:ss
              Timestamp wäre aber auch gegangen. Dein Code ist mir zu unübersichtlich um da mal durchzuschauen. Benutze besser sprechende Variablennamen.

              Und get_dir ist nach wie vor kein guter Funktionsbezeichner.
              [COLOR="#F5F5FF"]--[/COLOR]
              [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
              [COLOR="#F5F5FF"]
              --[/COLOR]

              Kommentar


              • #8
                Ich habe den Code jetzt mal bereinigt und versucht ihn besser lesbar zu machen. Ich hoffe es ist gelungen.

                PHP-Code:
                function get_maxdate($dir
                {
                  
                $i=0;
                  
                $fp=opendir($dir);
                  
                $maxdate_old;
                  while(
                $file=readdir($fp)) 
                  {
                    
                // ist Datei ein Verzeichnis -> rekursiver Aufruf um das Verzeichnis auszulesen
                    
                if (is_dir("$dir/$file") && $file!="." && $file!=".."
                    {
                      
                get_maxdate("$dir/$file"); 
                    }
                    
                // ist Datei kein Verzeichnis -> ausgeben
                    
                else if ((!is_dir("$dir/$file")) && $file!="." && $file!=".."
                    {
                      
                // beim ersten Durchlauf die Variable mit dem Timestamp der zuerst gefundenen Datei füllen
                      
                if($i==0)
                      {
                        
                $maxdate_old=date('d.m.Y, H:i'filemtime($dir."/".$file));
                      }
                      
                // sonst: Timestamps vergleichen und den Max-Wert speichern
                      
                else if($i>0)
                      {
                        
                $maxdate_new=date('d.m.Y, H:i'filemtime($dir."/".$file)); 
                        if(
                $maxdate_old $maxdate_new)
                        {
                          
                $maxdate_old=$maxdate_new;
                        }
                      }
                      
                $i++;
                    }
                  }
                  
                closedir($fp);
                  return 
                $maxdate_old;

                Mein Problem ist die Rekursion. Solange nur Dateien verglichen werden, funktioniert alles wie gewollt. Wird ein Verzeichnis gefunden und die Funktion rekrsiv aufgerufen (um in das Verzeichnis zu springen) wird das aktuellste Datum wieder "vergessen". Kann mir jemand sagen, wie ich es schaffe, auch bei rekusrivem Programmaufruf den aktuellen Max-Wert zu behalten? Zur Zeit vergleicht das Programm nach rekursivem Aufruf wieder mit dem Timestamp der dort gefundenen Datei und nicht mit dem schon vorher ermittelten Wert.

                Danke & Gruß
                Marcus

                Kommentar


                • #9
                  Schau dir doch mal die Zeile an, in der der rekursive Aufruf steht, du verarbeitest den Rueckgabewert ja ueberhaupt nicht.
                  "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

                  Kommentar


                  • #10
                    Du brauchst du den letzten Wert ja innerhalb der Funktion erneut. Deshalb musst du ihn auch immer mitgeben, am Anfang einfach 0. Dann wird das Ganze sehr simpel:
                    PHP-Code:
                    function get_maxdate($dir$ts) {
                        
                    $fp opendir($dir);
                        while (
                    $file readdir($fp)) {
                            if (
                    $file == "." && $file == "..") {
                                continue;
                            }
                            if (
                    is_dir("$dir/$file")) {
                                
                    $ts get_maxdate("$dir/$file"$ts);
                            }
                            else{
                                return 
                    max($tsfilemtime("$dir/$file"));                                    
                            }
                        }
                        
                    closedir($fp);
                    }

                    // Der Aufruf z.B.
                    echo date('d.m.Y, H:i'get_marxate('.'0)); 
                    Gruss
                    L

                    Kommentar


                    • #11
                      [OT]
                      Zitat von lazydog Beitrag anzeigen
                      PHP-Code:
                      // Der Aufruf z.B.
                      echo date('d.m.Y, H:i'get_marxate('.'0)); 
                      Was gibt denn get_marxate aus? Den Geburts- oder den Todestag von Marx?
                      [COLOR="#F5F5FF"]--[/COLOR]
                      [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                      [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                      [COLOR="#F5F5FF"]
                      --[/COLOR]

                      Kommentar


                      • #12
                        [OT]
                        Wahrscheinlich hat mich dieses unscharfe Bild inspiriert:

                        Gruss
                        L

                        Kommentar

                        Lädt...
                        X