Mario: file_exists notwendig?

Hi,

wenn ich auf file_exists() verzichten wollte, wäre das zb. so:

if(!$xy=@file_get_contents('test.csv')){echo 'Nicht vorhanden';}else{echo $xy;}

Ich gehe aber mal davon aus der Verzicht ist nicht zu empfehlen, warum eigentlich?

Eine andere Frage, in einem Verzeichnis liegen >=1000 Dateien. Darin befindet sich auch eine Indexierungsdatei, in de alle vorhandenen Dateien gelistet sind. Was wäre jetzt sinvoller(aus performancegründen), file_exists() zu verwenden oder den Index öffnen und mit strpos nachschauen ob das File vorhanden ist?

Mario

  1. Hi,

    wenn ich auf file_exists() verzichten wollte, wäre das zb. so:

    if(!$xy=@file_get_contents('test.csv')){echo 'Nicht vorhanden';}else{echo $xy;}

    Nein, damit erhaeltst du im Fehlerfalle nicht die gleiche Info. Eine Datei kann ja noch aus anderen Gruenden als Nichtexistenz nicht lesbar sein.

    Ich gehe aber mal davon aus der Verzicht ist nicht zu empfehlen, warum eigentlich?

    Warum gehst du davon aus?
    Wenn du einen vernuenftigen Grund dafuer oder dagegen findest (bzw. verschiedene gegeneinander abwaegst), dann sollte die Frage doch beantwortet sein.

    Eine andere Frage, in einem Verzeichnis liegen >=1000 Dateien. Darin befindet sich auch eine Indexierungsdatei, in de alle vorhandenen Dateien gelistet sind. Was wäre jetzt sinvoller(aus performancegründen), file_exists() zu verwenden oder den Index öffnen und mit strpos nachschauen ob das File vorhanden ist?

    file_exists, wuerde ich sagen. Die "Suche" darueber kann das OS bzw. Filesystem selber optimieren.

    Ob bei so einer Anzahl eine weitere Aufteilung auf mehrere Verzeichnisse nicht ggf. sinnvoller waere, ist eine andere Frage.

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
    1. Hi,

      if(!$xy=@file_get_contents('test.csv')){echo 'Nicht vorhanden';}else{echo $xy;}

      Nein, damit erhaeltst du im Fehlerfalle nicht die gleiche Info. Eine Datei kann ja noch aus anderen Gruenden als Nichtexistenz nicht lesbar sein.

      »»
      damit hast du wahrscheinlich recht. Beispiel?

      Ich gehe aber mal davon aus der Verzicht ist nicht zu empfehlen, warum eigentlich?

      Warum gehst du davon aus?

      Weil hier allgemein gilt solche Fehlermeldungen sollte man nicht unterdrücken. Warum weiss ich allerdings nicht.

      Wenn du einen vernuenftigen Grund dafuer oder dagegen findest (bzw. verschiedene gegeneinander abwaegst), dann sollte die Frage doch beantwortet sein.

      Darum frage ich ja hier um eben mögliche Gründe zu erfahren damit ich das abwägen kann. Im Moment denke ich warum eine(oder mehr wenn noch clearstatcache hinzukommt) extra Funktion nutzen, wenn ich diese sparen kann.

      file_exists, wuerde ich sagen. Die "Suche" darueber kann das OS bzw. Filesystem selber optimieren.

      Ja vermute ich auch, aber ein objektiver Test fällt natürlich aus, weil unterschiedlich je nach System.

      Ob bei so einer Anzahl eine weitere Aufteilung auf mehrere Verzeichnisse nicht ggf. sinnvoller waere, ist eine andere Frage.

      Das ist in der Tat ein Sache für sich. Da sich die Dateien nicht kategorisieren lassen(bzw. wäre sinnlos), müsste ich absichtlich eine Verzeichnisstrukur dafür ausdenken, die mir mehr Aufwand beim Auslesen macht. Klar alles rekursiv möglich. Aber da verstehe ich die OS-Hersteller nicht, warum die Filesysteme so limitiert sind.

      Gruss
      Mario

      1. Mahlzeit,

        damit hast du wahrscheinlich recht. Beispiel?

        Fehlende Dateirechte, Binär- statt Asciidatei, Fehlerhafte Datei usw.

        Weil hier allgemein gilt solche Fehlermeldungen sollte man nicht unterdrücken. Warum weiss ich allerdings nicht.

        Du unterdrückst keine Fehlermeldung, du prüfst einfach gar nicht erst.
        Das ist dann ekin Problem, wenn du sicherstelölen kannst, die gewünschte Datei ist vorhanden.
        Ansonsten fängt man jeden Fehler ab um z.B. einen Hacker keinen Ansatz für einen Angriff zu liefern oder "nur" dem User eine saubere Seite zu liefern.

        Darum frage ich ja hier um eben mögliche Gründe zu erfahren damit ich das abwägen kann. Im Moment denke ich warum eine(oder mehr wenn noch clearstatcache hinzukommt) extra Funktion nutzen, wenn ich diese sparen kann.

        Wieso glaubst du, das ögffnen und lesen einer Datei wäre "billiger" als eine          reine Prüfung auf Vorhandensein, die das Betriebssystem vornimmt?
        Wäre ja so, als wenn du ins Auto steigst und einmal um den Block fährst, nur um festzustellen, ob das Licht funktioniert.

        Ja vermute ich auch, aber ein objektiver Test fällt natürlich aus, weil unterschiedlich je nach System.

        Was ist nicht objektiv daran, das Betriebssystem zu fragen, ob die Datei vorhanden ist?

        Das ist in der Tat ein Sache für sich. Da sich die Dateien nicht kategorisieren lassen(bzw. wäre sinnlos), müsste ich absichtlich eine Verzeichnisstrukur dafür ausdenken,

        Wenn du dafür in Kauf nimmst, dass deine Software dadurch langsamer wird, ist das natürlich deine Sache. Ob es sinnvoll ist, kann jeder selbst entscheiden.

        1. Hi,

          damit hast du wahrscheinlich recht. Beispiel?

          Fehlende Dateirechte, Binär- statt Asciidatei, Fehlerhafte Datei usw.

          Zwei treffen zu, Binär aber nicht, denn das funktioniert ebenso mit file_get_contents.

          Weil hier allgemein gilt solche Fehlermeldungen sollte man nicht unterdrücken. Warum weiss ich allerdings nicht.

          Du unterdrückst keine Fehlermeldung, du prüfst einfach gar nicht erst.
          Das ist dann ekin Problem, wenn du sicherstelölen kannst, die gewünschte Datei ist vorhanden.

          Ich unterdrücke die Fehlermeldung die entsteht, falls die Datei nicht existiert: "...failed to open stream: No such file or directory..."

          Ansonsten fängt man jeden Fehler ab um z.B. einen Hacker keinen Ansatz für einen Angriff zu liefern oder "nur" dem User eine saubere Seite zu liefern.

          Ja aber dann mit den Error-Funkionen, nicht mit einem @ normalerweise.

          Wieso glaubst du, das ögffnen und lesen einer Datei wäre "billiger" als eine          reine Prüfung auf Vorhandensein, die das Betriebssystem vornimmt?
          Wäre ja so, als wenn du ins Auto steigst und einmal um den Block fährst, nur um festzustellen, ob das Licht funktioniert.

          Da hast du einen Denkfehler, öffnen würde ich die Datei sowieso wenn vorhanden, also um bei deinem Beispiel zu bleiben, ich muss eh um den Block fahren, so oder so.

          Ja vermute ich auch, aber ein objektiver Test fällt natürlich aus, weil unterschiedlich je nach System.

          Was ist nicht objektiv daran, das Betriebssystem zu fragen, ob die Datei vorhanden ist?

          Lies bitte nochmal den gesamten Kontext dazu.

          Das ist in der Tat ein Sache für sich. Da sich die Dateien nicht kategorisieren lassen(bzw. wäre sinnlos), müsste ich absichtlich eine Verzeichnisstrukur dafür ausdenken,

          Wenn du dafür in Kauf nimmst, dass deine Software dadurch langsamer wird, ist das natürlich deine Sache. Ob es sinnvoll ist, kann jeder selbst entscheiden.

          Ja, natürlich ist eine einziges Verzeichnis nicht gerade sinnvoll, daher finde ich es ja schade, das die Filesysteme der OS so funktionieren. Es also kein Interesse besteht, es dem User zu ermöglichen beliebig viele Files in ein Verzeichnis zu packen.

          Mario

          1. Hallo

            Weil hier allgemein gilt solche Fehlermeldungen sollte man nicht unterdrücken. Warum weiss ich allerdings nicht.

            Du unterdrückst keine Fehlermeldung, du prüfst einfach gar nicht erst.
            Das ist dann ekin Problem, wenn du sicherstelölen kannst, die gewünschte Datei ist vorhanden.

            Ich unterdrücke die Fehlermeldung die entsteht, falls die Datei nicht existiert: "...failed to open stream: No such file or directory..."

            Es ging aber in dem Wortwechsel nicht darum, sondern um den Verzicht auf file_exists().

            Ansonsten fängt man jeden Fehler ab um z.B. einen Hacker keinen Ansatz für einen Angriff zu liefern oder "nur" dem User eine saubere Seite zu liefern.

            Ja aber dann mit den Error-Funkionen, nicht mit einem @ normalerweise.

            Im Bedarfsfall auch mit "@", da es zwar nicht den Fehler abfängt, aber eine entsprechende Meldung unterdrückt. In einigen wenigen Fällen ist dies erforderlich, da eine eigene Fehlerbehandlung zu spät ansetzt.

            Wieso glaubst du, das ögffnen und lesen einer Datei wäre "billiger" als eine reine Prüfung auf Vorhandensein, die das Betriebssystem vornimmt?

            Da hast du einen Denkfehler, öffnen würde ich die Datei sowieso wenn vorhanden, ...

            Liest du auch, was geschrieben wird im Zusammenhang (den du hier auseinander reißt)? Beim angesprochenen "öffnen und lesen einer Datei" geht es nicht um die zu verifizierende Datei, sondern um deinen Index, der alle Dateien enthält.

            Also nochmal, um einen weiteren Denkfehler zu vermeiden:

            Wieso glaubst du, das Öffnen und Lesen einer (Index-)Datei wäre "billiger" als eine reine Prüfung auf Vorhandensein (der zu suchenden Datei), die das Betriebssystem vornimmt?

            Ja, natürlich ist eine einziges Verzeichnis nicht gerade sinnvoll, daher finde ich es ja schade, das die Filesysteme der OS so funktionieren. Es also kein Interesse besteht, es dem User zu ermöglichen beliebig viele Files in ein Verzeichnis zu packen.

            ?

            Was macht dich glauben, dass die Dateisysteme der verschiedenen Betriebssysteme Einfluss auf die Anzahl der in einem Verzeichnis speicherbaren Dateien nehmen?

            Tschö, Auge

            --
            Die deutschen Interessen werden am Liechtenstein verteidigt.
            Veranstaltungsdatenbank Vdb 0.2
            1. Hi,

              Ich unterdrücke die Fehlermeldung die entsteht, falls die Datei nicht existiert: "...failed to open stream: No such file or directory..."

              Es ging aber in dem Wortwechsel nicht darum, sondern um den Verzicht auf file_exists().

              Nicht ganz, denn wenn file_get_contents im "nicht vorhanden" Fall keine Fehlermeldung senden würde, sondern wie viele Andere Funktionen eben nur FALSE, dann würde sich die frage nach file_exists gar nicht stellen.

              Ja aber dann mit den Error-Funkionen, nicht mit einem @ normalerweise.

              Im Bedarfsfall auch mit "@", da es zwar nicht den Fehler abfängt, aber eine entsprechende Meldung unterdrückt. In einigen wenigen Fällen ist dies erforderlich, da eine eigene Fehlerbehandlung zu spät ansetzt.

              Na ja, aber es gibt genug Beiträge hier, wo dann direkt gemeckert wird.

              Liest du auch, was geschrieben wird im Zusammenhang (den du hier auseinander reißt)? Beim angesprochenen "öffnen und lesen einer Datei" geht es nicht um die zu verifizierende Datei, sondern um deinen Index, der alle Dateien enthält.

              Upps, ja da hatte ich wohl einen Sehfehler. Und wenn ichg das jetzt richig deute, dann ist file_exists() viel effektiver als meine Indexdatei.

              Was macht dich glauben, dass die Dateisysteme der verschiedenen Betriebssysteme Einfluss auf die Anzahl der in einem Verzeichnis speicherbaren Dateien nehmen?

              Glaube ich gar nicht, ausser im Hauptverzeichnis, aber die Performance sinkt rapide, je mehr Dateien in einem Verzeichnis, und insofern scheint es wohl kein Mittel oder kein Interesse von Seite der OS-Hersteller zu bestehen, diesem Umstand Rchnung zu tragen.

              Mario

              1. Mahlzeit,

                Na ja, aber es gibt genug Beiträge hier, wo dann direkt gemeckert wird.

                Dann steht aber entweder dabei, dass es ausnahmen gibt oder die Beiträge stammen von Postern, die keine Ahnung haben.
                Es gibt sicher nicht viele Ausnahmen, die ein @ rechtfertigen, aber es gibt sie. Dein Fall gehört _nicht_ zu diesen Ausnahmen.

                Upps, ja da hatte ich wohl einen Sehfehler. Und wenn ichg das jetzt richig deute, dann ist file_exists() viel effektiver als meine Indexdatei.

                Davon kannst du erstmal ausgehen. Vorallem spart es massiv Speicher bei vielen gleichzeitigen Zugriffen.

                Glaube ich gar nicht, ausser im Hauptverzeichnis, aber die Performance sinkt rapide, je mehr Dateien in einem Verzeichnis, und insofern scheint es wohl kein Mittel oder kein Interesse von Seite der OS-Hersteller zu bestehen, diesem Umstand Rchnung zu tragen.

                Das ist auch kein Problem der BS-Hersteller. Jeder kann ja selbst entscheiden, wo und wie er seine Dateien ablegt. Wenn ein Programmierer es vorzieht, tausende Dateien in einen Ordner zu packen, ist das seine Sache, wie sinnvoll das ist, eine völlig andere.

                Du solltest dringend an deinem Dateikonzept arbeiten. Mehr als 200 Dateien würde ich nicht in einen Ordner packen, denn die Performance ist beim rekursiven Durchsuchen wesentlich besser als beim Durchsuchen von tausenden Dateien in einem Ordner, vom Speicherverbrauch mit einem ekigenen Index mal abgesehen.

            2. Hello,

              Was macht dich glauben, dass die Dateisysteme der verschiedenen Betriebssysteme Einfluss auf die Anzahl der in einem Verzeichnis speicherbaren Dateien nehmen?

              die technischen Grenzen des jeweiligen Filesystems?

              MfG
              Rouven

              --
              -------------------
              sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
              Ambition is the last refuge of failure.  --  Oscar Wilde (Irish Poet, Novelist, Dramatist and Critic, 1854-1900)
              1. Hallo

                Was macht dich glauben, dass die Dateisysteme der verschiedenen Betriebssysteme Einfluss auf die Anzahl der in einem Verzeichnis speicherbaren Dateien nehmen?
                die technischen Grenzen des jeweiligen Filesystems?

                Ok, das bedeutet, bei einer bestimmten Clustergröße ergibt sich eine bestimmte maximale Dateianzahl in einer Partition, die bei vielen Dateiystemen eine bestimmte Größe nicht überschreiten kann. Von einer technischen Begrenzung der Anzahl von Dateien in einem Verzeichnis las ich aber nichts.

                Tschö, Auge

                --
                Die deutschen Interessen werden am Liechtenstein verteidigt.
                Veranstaltungsdatenbank Vdb 0.2
      2. echo $begrüßung;

        Weil hier allgemein gilt solche Fehlermeldungen sollte man nicht unterdrücken. Warum weiss ich allerdings nicht.

        Es gilt, Fehlermeldungen nicht zu unterdrücken, wenn man eine Fehlfunktion vorliegen hat und den Fehler dazu nicht findet. Besonders dann, wenn man nur ein Schönwetter-Script geschrieben hat.

        Wenn du dir bewusst bist, dass ein Fehler auftreten kann, und du beispielsweise durch Rückgabewertauswertung darauf reagierst, nur PHP meint, dazu jetzt auch noch unbedingt eine Meldung auszugeben, dann sehe ich die Unterdrückung derselben als legitim an.

        echo "$verabschiedung $name";