[Borland C++] Pfad von exe herausfinden und Datei abschneiden

daniel_sun

Erfahrenes Mitglied
Hallo,

ich habe ein Problem. Ich arbeite mit dem Borland C++ Builder und möchte den Pfad meiner exe (je nach dem in welchen Ordner ich sie halt ausführe) herausfinden und davon dann den Dateinamen abtrennen (so das ich nur noch dem Pfad habe).

Google schon seit 2 Tagen. Habe eine Menge gefunden leider nichts was in Borland funktioniert. Hab mir schon versucht aus verschiedenen Tutorials was für Borland zusammen zu Basteln aber spätestens am "abschneiden" des Dateinames scheitert es.

Kann mit hier jemand eine Lösung bieten?

Danke im vorraus.

MFG
daniel_sun
 
Es gibt eine Funktion getwd(), die müsste einfach dein Aktuellen Pfad ausgeben, solange du das Arbeitsverzeichnis nicht änderst.
 
Bei mir funktioniert es folgendermaßen:
(allerdings mit dem MinGW-Compiler)
Code:
#include <windows.h>
#include <string>

using namespace std;

/*****************************************/
/**         Gets the Path of the
                Application             **/
/*****************************************/
string GetAppPath (void)
{
    const int LEN = 1000;
    char directory[LEN]; string ret=""; int SlashPos;
    GetModuleFileName(NULL,directory,LEN);

    for (int x=strlen(directory); x>=0; x--)
    {
        if (directory[x]=='\\')
        {
            SlashPos=x;
            break;
        }
    }
    for (int x=0; x<SlashPos; x++)
    {
        ret += directory[x];
    }
    return(ret);
}
 
Zuletzt bearbeitet:
Hi.

@Jacal: Du prüfst nicht auf Fehler und deine Funktion ist unnötig kompiliziert. Außerdem ist es evlt. besser auch den Schrägstrich als valides Trennzeichen zu beachten.
C++:
string GetAppPath (void) {
  const size_t max = 1000;
  
  char buf[max];
  DWORD len = GetModuleFileName(NULL, buf, max);

  if (len != 0 && len < max) {
    string path(buf, len);
    string::size_type pos = path.find_last_of("\\/");
    
    if (pos != string::npos) path.resize(pos);

    return path;
  } else {
    // Fehler. (Puffer zu klein?)

    return string();
  }
}
Gruß

PS: Evlt. wäre es auch besser wenn die Funktion einen Fehlerwert zurückgibt und stattdessen einen Ausgabeparameter besitzt.
 
Zuletzt bearbeitet:
Hi.

@Jacal: Du prüfst nicht auf Fehler und deine Funktion ist unnötig kompiliziert. Außerdem ist es evlt. besser auch den Schrägstrich als valides Trennzeichen zu beachten.

Gruß

PS: Evlt. wäre es auch besser wenn die Funktion einen Fehlerwert zurückgibt und stattdessen einen Ausgabeparameter besitzt.

Hm, ja.. du hast Recht.
Mit Ausgabeparameter, meinst du das so:
C++:
bool GetAppPath (string &str) {
  const size_t max = 1000;
  
  char buf[max];
  DWORD len = GetModuleFileName(NULL, buf, max);

  if (len != 0 && len < max) {
    string path(buf, len);
    string::size_type pos = path.find_last_of("\\/");
    if (pos != string::npos) path.resize(pos);

    /* Könnte man stattdessen auch schreiben:
     *       str (buf, len);
     *       string::size_type pos = str.find_last_of("\\/");
     *       if (pos != string::npos) str.resize(pos);
    */

    str  = path;
    return true;
  } else {
    // Fehler. (Puffer zu klein?)

    return false;
  }
}
 
Hi.
Mit Ausgabeparameter, meinst du das so:
Ja, genau. Wie du schon bemerkt hast, kann man dann auf die lokale Variable verzichten und direkt den Parameter verwenden:
C++:
str.assign(buf, len);
\edit: Der Nachteil ist, dass die Methode dann nicht mehr exception-safe ist (was passiert wenn str.assign() eine Ausnahme wirft?), dann sollte man besser eine lokale Variable verwenden und zum Schluß aufrufen:
C++:
str.swap(path);
Gruß

PS: @daniel_sun: Bitte markier das Thema als erledigt wenn deine Frage beantwortet ist.
 
Zuletzt bearbeitet:
Auch auf die Gefahr hin, hier klugzuscheissen:
In der VCL gibt es dafür definitiv Methoden. Wenn du also die VCL verwendest, dann kannst du dir das Leben sehr viel einfacher machen:

Code:
#include <SysUtils.hpp>

String Pfad = ExtractFilePath(Application->ExeName);
 
Zurück