System::IO::File::Exists ohne .NET



  • Die meisten werden mich wahrscheinlich für blöd halten so ne Frage zu stellen.
    Ich hab so was halt noch nie gebraucht, da ich nur Spiele mit Allegro programmiere. Die sollen halt nicht auf .Net angewiesen sein.

    Ich suche eine c++ Funktion, die kein .Net beansprucht in der Form vom .Net:

    bool Exists(const char* filename)

    Kann mir jemand helfen?



  • Boost.Filesystem hat eine Funktion exists() . Falls du die Boost-Bibliothek noch nicht hast, kannst du sie dir ja trotzdem mal anschauen, sie beinhaltet sehr viele nützliche Dinge für den C++-Alltag.



  • Hey.

    Deine Frage hat mein Interesse geweckt und ich dachte ich programmier mal was.
    Ist vielleicht bisschen gehackt aber es geht ^^:

    #include <iostream>
    #include <fstream>
    
    bool fileExists(char *filename)
    {
      std::ifstream stream(filename);
      return (stream!=NULL);
    }
    
    int main(int argc, char *argv[])
    {
      if(argv[1] == NULL)
        {
          std::cout << "Incorrect program arguments. Usage: ./file_exists myfile.dat\n";
          return -1;
        }
    
      std::cout << "The file " << (fileExists(argv[1]) ? "exists\n" : "does not exist\n");
      return 0;
    }
    

    Also eigentlich ist nur die fileExists Funktion wichtig. Das Programm kannst du in der Konsole mit dem entsprechendem Filenamen als Program Argument ausführen.

    Grüße

    Max



  • > Ist vielleicht bisschen gehackt aber es geht ^^:

    Nein, es geht nicht. Wenn die Datei Rechte erfordert, die der Nutzer nicht hat, scheitert das Programm.



  • Korrigiert mich wenn ich falsch liege, aber das kann doch gar nicht funktionieren. Wie kann denn ein ifstream bitte NULL sein??? Wenn überhaupt dann is_open(), was aber die von Ad Acta angesprochene Problematik hat, dass false nicht zwingend bedeutet dass die Datei nicht exisitiert.

    Eine andere Idee wäre noch eine Datei mit dem Namen zu erzeugen und falls dies scheitert zu schließen, dass bereits eine Datei mit diesem Namen existiert. Es ist aber auch hier genausogut möglich dass man einfach keine Schreibrechte in diesem Verzeichnis besitzt.



  • OhneName schrieb:

    Korrigiert mich wenn ich falsch liege, aber das kann doch gar nicht funktionieren. Wie kann denn ein ifstream bitte NULL sein??? Wenn überhaupt dann is_open(), was aber die von Ad Acta angesprochene Problematik hat, dass false nicht zwingend bedeutet dass die Datei nicht exisitiert.

    Also bei mir hats funktioniert.
    Natürlich hatte ich alle nötigen Rechte.
    Der Konstruktor setzt bei ifstream vorraus, dass das File existiert. Wenn nicht gibts auch keinen Stream.



  • Max3000 schrieb:

    Der Konstruktor setzt bei ifstream v******, dass das File existiert. Wenn nicht gibts auch keinen Stream.

    Er setzt voraus dass das File existiert und geöffnet werden kann. Den Stream gibts so oder so, nur hat er bei fehlgeschlagenem Ctor das Statusflag auf false.

    Wenn das file zwar existiert, aber nicht geöffnet werden kann (aus welchem Grund auch immer), dann gibt deine file_exists-Funktion auch false zurück, behauptet also, dass die Datei nicht existiert - was dann eben nicht richtig ist.



  • OhneName schrieb:

    Wie kann denn ein ifstream bitte NULL sein???

    http://www.cplusplus.com/reference/iostream/ios/operator_voidpt/



  • OhneName schrieb:

    Korrigiert mich wenn ich falsch liege, aber das kann doch gar nicht funktionieren. Wie kann denn ein ifstream bitte NULL sein???

    So kann er das...



  • l'abra d'or schrieb:

    OhneName schrieb:

    Wie kann denn ein ifstream bitte NULL sein???

    http://www.cplusplus.com/reference/iostream/ios/operator_voidpt/

    Danke, da bin ich nicht draufgekommen obwohl man ihn beim !-Operator ja indirekt ständig benutzt. Sonderlich intuitiv finde ich diese Verwendung mit "== NULL" aber nicht.


Anmelden zum Antworten