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



## daniel_sun (8. März 2009)

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


----------



## Ryu1991 (8. März 2009)

Es gibt eine Funktion getwd(), die müsste einfach dein Aktuellen Pfad ausgeben, solange du das Arbeitsverzeichnis nicht änderst.


----------



## Jacal (8. März 2009)

Bei mir funktioniert es folgendermaßen:
(allerdings mit dem MinGW-Compiler)

```
#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);
}
```


----------



## daniel_sun (8. März 2009)

Jacal danke deine Funktion klappt auch in borland super.


----------



## deepthroat (8. März 2009)

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.

```
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.


----------



## Jacal (8. März 2009)

deepthroat hat gesagt.:


> 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.
> 
> ...



Hm, ja.. du hast Recht.
Mit Ausgabeparameter, meinst du das so:

```
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;
  }
}
```


----------



## deepthroat (8. März 2009)

Hi.





Jacal hat gesagt.:


> 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:

```
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:

```
str.swap(path);
```
Gruß

PS: @daniel_sun: Bitte markier das Thema als erledigt wenn deine Frage beantwortet ist.


----------



## CSANecromancer (9. März 2009)

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:


```
#include <SysUtils.hpp>

String Pfad = ExtractFilePath(Application->ExeName);
```


----------

