Datei überprüfen



  • Hallo!
    Ein einem meiner Programme, habe ich vor, zu überprüfen, ob eine bestimmte Datei vohanden ist.
    So funktioniert es nicht:

    try
    {
    Memo1->Lines->LoadFromFile("C:\\datei1.txt");
    }
    catch(...)
    {
    Application->MessageBox ("Datei nicht gefunden!", "");
    }
    

    Aber wie kann ich sonst das Existieren einer bestimmten Datei überprüfen?

    Danke,
    Was_weiß_ich_?



  • std::ifstream stream ("C:/bla.txt");
    if (stream)
     //alles klar
    else
     //gibts nich
    

    bb



  • Da er den BCB verwendet würde auch das hier gehen.

    if( !FileExists("C:\\datei1.txt"))
    {
        Application->MessageBox ("Datei nicht gefunden!", "");
    }
    


  • Ok,
    ich hätte aber gerne, dass, wenn die Datei nicht existstiert ein anderes Formaular gezeigt wird:

    if( !FileExists("C:\\datei1.txt"))
            {
            Form2->ShowModal();
            }
    

    Doch da kommt folgende Fehlermeldung:

    Im Pfojekt Project1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung:'Zugriffsverletzung bei Adresse 00401D84 in Modul 'Project1.exe'. Lesen von Adresse 000000000'. Prozess wurde angelhalten. Mit einzelne Anweisung oder Start fortsetzten.

    Weiß jemand warum?

    Danke,
    Was_weiß_ich_?



  • Geh mit dem Debugger durch und schau nach ob Form2 schon existiert.



  • Form2 existiert sicher.



  • // exists oder file_exists, bin grade net sicher ;)
    if ( boost::filesystem::exists(file) )
    {
    }
    

    rya.



  • Was_weiß_ich_? schrieb:

    Form2 existiert sicher.

    Bist du mit dem Debugger durchgegangen um den Fehler einzugrenzen? Hast du die Variablen überprüft?



  • scorcher24 | off schrieb:

    // exists oder file_exists, bin grade net sicher ;)
    if ( boost::filesystem::exists(file) )
    {
    }
    

    rya.

    exists ist schon richtig. Wobei hier file vom Typ boost::filesystem::path sein muss. Da er den BCB verwendet sollte er eine ältere boost-Version (1.34 oder so) nehmen da die BCB-Compiler mit den neuren versionen so ihre Probleme haben. Allerdings ist beim BCB2009 boost 1.35 dabei.


  • Administrator

    Braunstein schrieb:

    Wobei hier file vom Typ boost::filesystem::path

    Nicht zwingend, denn der Konstruktor von boost::filesystem::path , welcher einen std::string annimmt, ist implizit. Somit kann man auch direkt einen std::string übergeben oder sogar ein String-Literal. Letzteres wird dann zuerst in ein std::string umgewandelt und dann in ein boost::filesystem::path .

    Grüssli



  • War das schon immer so?
    Ich kann mich erinnern, dass das bei 1.33 und 1.34 bei mir nicht ging. Es kann natürlich auch an meinem Compiler gelegen haben.


  • Administrator

    Braunstein schrieb:

    War das schon immer so?
    Ich kann mich erinnern, dass das bei 1.33 und 1.34 bei mir nicht ging. Es kann natürlich auch an meinem Compiler gelegen haben.

    Jedenfalls ganz sicher seit 1.34:
    http://www.boost.org/doc/libs/1_34_0/libs/filesystem/doc/tr2_proposal.html#basic_path-requirements

    Und da seh ich auch noch, dass ich eine Unwahrheit gesagt habe. boost::filesystem::path hat sogar einen impliziten Konstruktor für char const* . 🙂

    Vor 1.33 kann ich nichts sagen, da ich da noch nicht mit Boost gearbeitet habe und die Referenz reicht auch nicht so weit zurück. Wenn man sich allerdings die "Change History" anschaut, so findet man unter 1.34 die "Simplification of the path interface". Wenn ich das richtig verstehe, waren vorher zwei Argumente nötig, um ein path Objekt zu erstellen. Da wäre natürlich eine impliziter Konstruktor schlecht möglich 🙂

    Grüssli


Anmelden zum Antworten