relativer Pfad



  • Hallo zusammen!

    Zwar peinlich, aber ich muss hiermit zugeben, dass die Dateiverwaltung in meinen BCB-Anwendungen nicht so funktioniert, wie ich mir das gewünscht hätte.
    Wurzel allen Übels ist der Methodenaufruf 'file.open(...)' aus der fstream.h
    Speziell:

    ifstream *file=new ifstream();
    string path=".\\lib\\model\\"+filename;
    file->open(path.c_str(),ios::in|ios::binary);
    
    if(!file->is_open())
       throw TFileHandlingException("'"+path+"' wurde nicht gefunden!");
    

    Der Grund für die geworfene Exception: die von mir verwendeten relativen Pfadangaben. Ich kann mir niemals sicher sein, dass meine Anwendung 'path' auch tatsächlich findet. Mal wird die Datei gefunden, mal nicht (recht idiotisch), zumal sich die Pfadangaben meiner Anwendung bisher nicht geändert haben. Absolute Pfade will ich dennoch nicht implementieren. Eine Anwendung muss doch portabel bleiben.
    Ist Euch sowas schon einmal passiert? Bei VC hatte ich das Problem bisher noch nicht. Ist die Geschichte mit den relativen Pfadangaben ein generelles Problem bei Borland?
    => Verwendet Ihr relative Pfadangaben, oder ermittelt Ihr das Wurzelverzeichnis Eurer Anwendung?

    Grüße,
    TS++

    Ach ja:
    IDE: BCB 6.0 Personal (Build 10.166)



  • Vielleicht solltest du GetCurrentDirectory verwenden und den Rest dann dranhängen. Dann kannst du dir sicher sein, dass die Datei - falls sie vorhanden ist - gefunden wird.



  • GetCurrentDirectory liefert das Arbeitsverzeichnis, und das kann sich während der Programmausführung ändern, z.B. durch Benutzung des OpenDialogs.

    TS++ schrieb:

    Verwendet Ihr relative Pfadangaben, oder ermittelt Ihr das Wurzelverzeichnis Eurer Anwendung?

    Relativ, aber in Bezug auf das absolut ermittelte Installationsverzeichnis. Also z.B.

    String path = ExtractFilePath(Application->ExeName) + "lib\\model\\" + filename;
    


  • Danke Euch!

    Ihr habt mir damit wirklich sehr geholfen!

    Eine Kleinigkeit vielleicht noch zu 'GetCurrentDir()':
    Offensichtlich wird bei einer Pfadangabe der folgenden Form
    '.\folder1\folder11\file' der Punkt immer durch den Rückgabewert von 'GetCurrentDir()' ersetzt. Ich bin dummerweise immer davon ausgegangen, dass das Wurzelverzeichnis des Projekts angesetzt würde.

    Mit 'ExtractFilePath(...)' müsste ich jetzt wunderbar zurechtkommen!

    Danke! 🙂

    Grüße,
    TS++


Anmelden zum Antworten