Kirstin: Fehlermeldung bei filemtime($file)

Hallo,

ich habe ein kleines Script das mir die Verzeichnis ausliest.

$verzeichnis = openDir('datei');

while ($file = readDir($verzeichnis)) 
	{
	if ($file != "." && $file != "..") 
		{
		echo $file;
		echo '<br/>';
		}
	}
closeDir($verzeichnis);

dann möchte ich auch noch das Datum mitausgeben.

ich habe also zum testen nur das

echo $file;

gegen

echo date ("F d Y H:i:s.", filemtime($file));

getauscht. Doch nun bekomme ich diese Fehlermeldung.

Warning: filemtime(): stat failed for

aber der Pfad stimmt ja, weil bei $file kommt ja das Ergebniss.

Kirstin

  1. Tach!

    ich habe ein kleines Script das mir die Verzeichnis ausliest.

    $verzeichnis = openDir('datei');
    
    while ($file = readDir($verzeichnis)) 
    	{
    	if ($file != "." && $file != "..") 
    		{
    		echo $file;
    		echo '<br/>';
    		}
    	}
    closeDir($verzeichnis);
    

    Nimm lieber glob() statt mit den drei Funktionen openDir(), readDir() und closeDir() und zusätlich noch dem händischen Ausschluss von . und .. zu hantieren. Das kann glob() alles in einem.

    Warning: filemtime(): stat failed for

    Ist es eine besonders große Datei (> 2GB)? Im PHP-Handbuch gibt es zu dieser Fehlermeldung einen Kommentar.

    aber der Pfad stimmt ja, weil bei $file kommt ja das Ergebniss.

    Bist du sicher? Er muss vom aktuellen Arbeitsverzeichenis ausgehen, solange er nicht absolut ist. Das aktuelle Arbeitsverzeichnis ist das, in dem das gestartete Script steht, wenn er nicht verändert wurde. Wenn du nun in einem Unterverzeichnis suchst, gibt es die Ergebnisse auch nur relativ zu diesem Unterverzeichnis aus, was nicht zwangsläufig relativ zum aktuellen Arbeitsverzeichnis ist.

    dedlfix.

  2. Hallo,

    aber der Pfad stimmt ja, weil bei $file kommt ja das Ergebniss.

    Trugschluss. Was steht denn in $file? Der volle Pfad oder nur der Dateiname? stat() braucht den vollen Pfad. Entweder stringverketten oder ins Verzeichnis wechseln.

    MfG

    1. Tach!

      stat() braucht den vollen Pfad.

      PHPs filemtime() und auch stat() kommen problemlos mit relativen Angaben aus.

      dedlfix.

      1. Tach!

        stat() braucht den vollen Pfad.

        PHPs filemtime() und auch stat() kommen problemlos mit relativen Angaben aus.

        Was zur Lösung des Poblems nullkommanix beiträgt. Wie kann ein Fachmann sowas empfehlen wenn er gar nicht weiß ob im Script das aktuelle Verzeichnis bekannt ist? Am gezeigten Code ist nichts dergleichen festzustellen!

        Und selbst wenn die cwd festgestellt werden kann, ist es unsinnig bei stat() mit relativen Pfaden zu arbeiten.

        MfG

        1. Tach!

          stat() braucht den vollen Pfad.

          PHPs filemtime() und auch stat() kommen problemlos mit relativen Angaben aus.

          Was zur Lösung des Poblems nullkommanix beiträgt.

          Das war an dieser Stelle auch nicht meine Absicht, dazu hatte ich bereits ein eigenes Posting verfassst. Hier wollte ich lediglich die fehlerhafte Aussage richtigstellen.

          Und selbst wenn die cwd festgestellt werden kann, ist es unsinnig bei stat() mit relativen Pfaden zu arbeiten.

          Das ist nur eine Behauptung. Gibts dazu auch eine Begründung?

          Ich finde es eher wenig sinnvoll, erstmal den absoluten Pfad ermitteln zu müssen, wenn es eine korrekt notierte relative Angabe auch tut.

          dedlfix.

          1. Tach!

            Ich finde es eher wenig sinnvoll, erstmal den absoluten Pfad ermitteln zu müssen, wenn es eine korrekt notierte relative Angabe auch tut.

            Den Pfad braucht man ohnehin. Und zwar den Vollen. Also sollte man den auch verwenden, was den Code auch lesbarer macht!

            Der vom OP gezeigte Code weist übrigens erhebliche Mängel in dieser Hinsicht auf. Darauf sollte man hinweisen. Und nicht darauf was man sonst noch so machen kann.

            MfG

            1. Hallo pl,

              Den Pfad braucht man ohnehin. Und zwar den Vollen.

              Sicher?

              Der vom OP gezeigte Code weist übrigens erhebliche Mängel in dieser Hinsicht auf. Darauf sollte man hinweisen.

              Wer ist man? Warum tust du das nicht?

              Und nicht darauf was man sonst noch so machen kann.

              Insgesamt ist das wieder nur ein ablenken von den eigenen Unzulänglichkeiten.

              Bis demnächst
              Matthias

              --
              Rosen sind rot.
              1. Den Pfad braucht man ohnehin. Und zwar den Vollen.

                Sicher?

                Ja sicher doch. Sonst wird Programmieren zum Glücksspiel. Das Thema hatten wir übrigens vor Kurzem erst: Unsichere Pfadangaben im Zusammenhang mit Crontab und Batchdateien.

                Hierzu habe ich also genügend und sehr ausführlich allgemeine Hinweise geschrieben die auch allgemein gültig sind. Was PHP spezielle Dinge betrifft, die überlasse ich gerne dem Fachmann und vor Allem dem PHP Praktiker (der ich definitiv nicht bin). Ich habe nur gesehen daß opendir() völlig falsch verwendet wird. Der OP begeht einen systematischen Fehler (und ja, Wikipedia erklärt diesen Begriff völlig falsch). Des Weiteren sind die Namen der Variablen eher verwirrend als daß sie zu einem reproduzierbaren Code führen.

                Also: Wo sind denn die Praktiker? (sorry ich wiederhole mich)

                MfG

                1. Hallo pl,

                  Hierzu habe ich also genügend und sehr ausführlich allgemeine Hinweise geschrieben die auch allgemein gültig sind.

                  Und wie kommt der OP an diese Hinweise?

                  Bis demnächst
                  Matthias

                  --
                  Rosen sind rot.
                2. Tach!

                  Den Pfad braucht man ohnehin. Und zwar den Vollen.

                  Sicher?

                  Ja sicher doch. Sonst wird Programmieren zum Glücksspiel. Das Thema hatten wir übrigens vor Kurzem erst: Unsichere Pfadangaben im Zusammenhang mit Crontab und Batchdateien.

                  Das ist ein anderer Anwendungsfall. Und auch da reichen relative Angaben, wenn man es richtig macht. Da gibt es also auch keinen Zwang zu einem vollständigen Pfad.

                  Hierzu habe ich also genügend und sehr ausführlich allgemeine Hinweise geschrieben die auch allgemein gültig sind.

                  Wenn du geschrieben hättest: "Es ist empfehlenswert, den vollen Pfad zu nehmen, aus dem und dem Grunde", dann wäre das allgemeingültig gewesen. "stat() braucht den vollen Pfad" war jedenfalls nicht allgemeingültig, sondern in Bezug auf PHP schon mal nicht richtig. Allgemeingültigkeit war vermutlich auch nicht Ziel des OPs.

                  Ich habe nur gesehen daß opendir() völlig falsch verwendet wird.

                  Eine Erklärung dazu hätte ich gern, was daran "völlig falsch" sein soll.

                  dedlfix.

            2. Der vom OP gezeigte Code weist übrigens erhebliche Mängel in dieser Hinsicht auf.

              Hm. Ja. Dafür gibt es Anhaltspunkte. (Beginnend bei $verzeichnis = openDir('datei'); - konkret den Fehlbenennungen.) Womöglich folgen diese aber aus dem Strippen des Codes um uns was übersichtliches zu liefern.

              1. Der vom OP gezeigte Code weist übrigens erhebliche Mängel in dieser Hinsicht auf.

                Hm. Ja. Dafür gibt es Anhaltspunkte. (Beginnend bei $verzeichnis = openDir('datei'); - konkret den Fehlbenennungen.) Womöglich folgen diese aber aus dem Strippen des Codes um uns was übersichtliches zu liefern.

                Deswegen ja habe ich mich auf allgemeine Hinweise beschänkt.

                MfG

            3. Tach!

              Den Pfad braucht man ohnehin. Und zwar den Vollen. Also sollte man den auch verwenden, was den Code auch lesbarer macht!

              Wozu genau braucht man den? Was macht es besser, den vollen Pfad ermittelt und in einer Variable stehen zu haben als lediglich den relativen, der zum exakt selben Ergebnis führt?

              Der vom OP gezeigte Code weist übrigens erhebliche Mängel in dieser Hinsicht auf. Darauf sollte man hinweisen. Und nicht darauf was man sonst noch so machen kann.

              Kann sein, dass du da was anders siehst, aber dann erkläre dich bitte auch nachvollziehbar. Es hilft da nicht besonders, wenn du wie schon so oft meine konkreten Rückfragen ignorierst.

              Ich kann keinen "erheblichen Mangel" erkennen. Ich sehe da lediglich eine etwas umständliche Art, einen Verzeichnisinhalt aufzulisten und habe den Verdacht, dass der Dateiname nicht zur Datei zeigt, weil ein relatives Element vom Pfad zur Datei möglicherweise nicht beachtet wurde. Konkreter kann ich das nicht sagen, weil ich das System nicht vor mir habe, um es genauer untersuchen zu können. Dass man den absoluten Pfad bräuchte, ist lediglich deine Behauptung, die aber in Bezug auf filemtime() und stat() nicht richtig ist.

              dedlfix.

  3. Vermutlich willst Du filemtime( $verzeichnis . '/' . $file ).

    1. Tach!

      Vermutlich willst Du filemtime( $verzeichnis . '/' . $file ).

      Nicht in der Form, denn der Rückgabewert von opendir() ist kein Verzeichnisname.

      dedlfix.

  4. Hallo Kirstin,

    das Problem wurde bereits benannt, aber ich glaube, da gab es einen Mangel an Klarheit und einen Überschuss an Gezänk.

    Mal angenommen, deine Ordner-Struktur sieht so aus:

    ` usr
      ` datei
        !- foo.dat
        !- bar.dat
        `- baz.txt
    

    Damit dein openDir('datei') funktioniert, muss usr das Arbeitsverzeichnis sein und einen Ordner namens 'datei' enthalten. Deine readDir-Schleife liefert dann für $file die Werte 'foo.dat', 'bar.dat' und 'baz.txt'. Und zwar als reinen Dateinamen, ohne den Verzeichnispfad, der zu ihnen führt.

    Wenn Dein PHP Script nun filemtime('foo.dat') aufruft, dann sucht es foo.dat im aktuellen Verzeichnis. Das ist der /usr Ordner, und nicht /usr/datei. D.h. ihm fehlt ein Schritt auf dem Weg zur gefundenen Datei. Das ist das, was Regina meinte. Du musst für den filemtime Aufruf den Namen des Verzeichnisses, das Du an openDir übergeben hast, mit dem Namen der Datei verbinden.

    Alternativ kannst Du vor dem openDir auch erstmal mit chdir in den datei Ordner wechseln und dann openDir('.') aufrufen. Damit listest Du dann dass aktuelle Verzeichnis auf, und damit funktioniert auch filemtime($file).

    Rolf

    --
    sumpsi - posui - clusi
    1. Tach!

      Als Alternative dazu nochmal das bereits erwähnte glob(), das sowohl die Verzeichnisinhaltsermittlung vereinfacht, als auch die Sache mit der Relativität ohne weiteres Zutun löst.

      $files = glob('datei/*');
      

      Kontrollausgabe mit

      print_r($files);
      

      ergibt

      datei/file1.ext
      datei/file2.ext
      datei/file3.ext
      datei/file4.ext
      

      Das kommt also gleich mit relativem Pfad und direkter Verwendbarkeit mit filemtime().

      foreach (glob('datei/*') as $file) {
        echo date('Y-m-d H:i:s', filemtime($file));
      }
      

      dedlfix.