PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ (boost): Pfad zur Binary herausfinden


Gast
2009-10-18, 11:49:50
Hallo,

ich bräuchte den Pfad zur Binary die ich aufrufe, genauer gesagt bräuchte ich also argv[0], nur ohne den Programmnamen.

Ich könnte vermutlich mit argv[0] herumfummeln, um den letzten Teil abzuschneiden, aber gibt es einen eleganteren Weg? Ich setze C++ mit boost ein, und in Boost.Filesystem hätte ich so etwas eigentlich erwartet, kann aber leider nichts in der Richtung finden.

Hat jemand eine Idee?

The_Invisible
2009-10-19, 16:09:52
das müsste gehen:


#include "boost/filesystem.hpp"
#include <iostream>

int main(int argc, char **argv)
{
boost::filesystem::path my_file(argv[0]);

std::cout << "Full path: " << my_file.file_string() << std::endl;
std::cout << "Dir path: " << my_file.branch_path() << std::endl;
std::cout << "File name: " << my_file.leaf() << std::endl;

return EXIT_SUCCESS;
}


mfg

Gast
2009-10-21, 18:48:40
Tausend dank, genau sowas hatte ich mir gewünscht!

Ich wünschte, ich würde die Dokumentation (http://www.boost.org/doc/libs/1_35_0/libs/filesystem/doc/reference.html) kapieren... ist fast wie den code selbst zu lesen...

Gast
2009-10-22, 18:43:17
Es ist aber nicht garantiert das in argv[0] ein Pfad drinsteht.

Gast
2009-10-22, 22:12:34
Tausend dank, genau sowas hatte ich mir gewünscht!

Ich wünschte, ich würde die Dokumentation (http://www.boost.org/doc/libs/1_35_0/libs/filesystem/doc/reference.html) kapieren... ist fast wie den code selbst zu lesen...

wat??
ich liebe die boost-doc! da können einige kostenpflichtige libraries nicht mithalten (granted, da kann ich dem support auf den kopf steigen...)

Gast
2009-10-29, 19:42:27
Es ist aber nicht garantiert das in argv[0] ein Pfad drinsteht.

Was denn sonst? Es kann zwar ein relativer sein ("./programm"), aber ein Pfad isses doch immer - zumindestens bei UNIX.

wat??
ich liebe die boost-doc! da können einige kostenpflichtige libraries nicht mithalten (granted, da kann ich dem support auf den kopf steigen...)

Den Großteil der Boost Dokumentation finde ich super, aber die von mir verlinkte finde ich etwas ärmlich. Da hätte ich mir schon ein bisschen doxygen gewünscht oder irgendetwas annähernd übersichtliches.

Man muss erstmal durch Code lesen oder sonstwie herausfinden, dass "basic_path" das ist, wonnach man suchen muss, nicht "path". Dann kann man unter "observers" (???) und unter anderen unüblichen Überschriften die Methoden der Klasse finden. Ginge schon besser.

fezie
2009-10-29, 19:48:23
Was denn sonst? Es kann zwar ein relativer sein ("./programm"), aber ein Pfad isses doch immer - zumindestens bei UNIX.


Wenn die PATH Umgebungsvariable ./ enthält, dann nicht.
Aber gut wer macht das schon.

Gast
2009-10-29, 22:45:35
Wenn die PATH Umgebungsvariable ./ enthält, dann nicht.
Aber gut wer macht das schon.

Hm, das habe ich gerade mal ausprobiert, und das war mir neu. Wenn das Programm im Pfad liegt, ist argv[0] einfach nur der Programmname!

d.h. (angenommen "programm" liegt in "/etc"):
PATH=/etc cd /; programm
argv[0] = programm

Hm, das ist natürlich jetzt ein Problem. So finde ich nämlich _nicht_ den Pfad zur Binary heraus.

Hat jemand da eine Idee?

fezie
2009-10-29, 23:19:16
realpath() bzw. unter GNU libc das alias canonicalize_file_name dürfte helfen.
Müsste eigentlich auch nur mit einem Dateinamen funktionieren, solang halt das aktuelle Verzeichnis die enthält.

Gast
2009-10-31, 01:07:55
realpath() bzw. unter GNU libc das alias canonicalize_file_name dürfte helfen.
Müsste eigentlich auch nur mit einem Dateinamen funktionieren, solang halt das aktuelle Verzeichnis die enthält.

Naja, ich müsste sie ja nicht im aktuellen Verzeichnis finden, sondern im Suchpfad. Ich müsste quasi ein "type" ausführen. Und das ganze hätte ich gerne Plattformübergreifend :(