Forum: PC-Programmierung C++: std::filesystem falscher Pfad


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von C++Love (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

kurze Frage, wenn ich über ein shell-skript (#!/bin/sh 
x-terminal-emulator usw...) ein Programm öffne und den Programmpfad per 
std::filesystem::current_path() anzeigen lasse dann entspricht dieser: 
"/home/user" und ist damit falsch. Statt dem echten Programmpfad bekomme 
ich den Userpfad.

Hat jemand eine Idee wie ich per std::filesystem den korrekten Pfad 
erhalte?

Grüße

von g457 (Gast)


Bewertung
1 lesenswert
nicht lesenswert
> wenn ich über ein shell-skript (#!/bin/sh x-terminal-emulator usw...)
> ein Programm öffne und den Programmpfad per std::filesystem::current_path()
> anzeigen lasse dann entspricht dieser: "/home/user" [..]

also in "/home/user" ausgeführt?

> [..] und ist damit falsch.

Klingt nicht so.

> Statt dem echten Programmpfad bekomme ich den Userpfad.

std::filesystem::current_path() liefert das cwd, also alles bestens.

HTH

von Rolf M. (rmagnus)


Bewertung
0 lesenswert
nicht lesenswert
C++Love schrieb:
> kurze Frage, wenn ich über ein shell-skript (#!/bin/sh
> x-terminal-emulator usw...) ein Programm öffne und den Programmpfad per
> std::filesystem::current_path() anzeigen lasse dann entspricht dieser:
> "/home/user" und ist damit falsch.

Warum ist das falsch?

> Statt dem echten Programmpfad bekomme ich den Userpfad.

Was meinst du mit "echten Programmfad"? Du bekommst das aktuelle 
Arbeitsverzeichnis, was in so einem Fall üblicherweise das 
Home-Verzeichnis ist.

von C++Love (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
> also in "/home/user" ausgeführt?

Nein natürlich nicht daher die Frage, das Programm liegt ganz woanders 
als "/home/user".
Das shell-skript welches Programmpfad enthält liegt auf dem Desktop 
damit ich von dort das Programm starten kann.
Der durch std::filesystem::current_path() ermittelte Pfad ist falsch 
denn er zeigt das user-Verzeichnis und nicht den korrekten Pfad.

von C++Love (Gast)


Bewertung
0 lesenswert
nicht lesenswert
ok nochmal Beispiel:

Das Programm befindet sich in:
/home/user/data/projekt8/v2/program

Aber std::filesystem::current_path() gibt raus:
/home/user


Der echte Pfad ist im shell-skript und das shell-skript liegt auf dem 
Desktop damit ich von dort das Programm starten kann.

von Rolf M. (rmagnus)


Bewertung
2 lesenswert
nicht lesenswert
C++Love schrieb:
>> also in "/home/user" ausgeführt?
>
> Nein natürlich nicht daher die Frage, das Programm liegt ganz woanders
> als "/home/user".

In welchem Verzeichnis das Programm liegt, ist für die Funktion egal.

> Der durch std::filesystem::current_path() ermittelte Pfad ist falsch
> denn er zeigt das user-Verzeichnis und nicht den korrekten Pfad.

Nein, der ist richtig. Er entspricht dem Arbeitsverzeichnis. Was falsch 
ist, ist deine Annahme, dass es der sein müsse, wo die ausführbare Datei 
des Programms liegt.

von Martin K. (mk279)


Bewertung
1 lesenswert
nicht lesenswert
> Aber std::filesystem::current_path() gibt raus:
> /home/user

Ich sehe bei dem geschilderten Verhalten kein Problem. Du verwechselst 
wahrscheinlich (1) den aktuellen Pfad mit (2) dem Pfad, wo das 
Executable gespeichert ist.

Siehe auch 
https://stackoverflow.com/questions/4025370/can-an-executable-discover-its-own-path-linux

(1) kann sehr wohl mit std::filesystem::current_path() abgefragt werden;
(2) wohl am bequemsten über das Auslesen des Links von /proc/self/exe, 
siehe stackoverflow. Einfach mal ausprobieren mit
ls -al /proc/self/exe
 oder
readlink /proc/self/exe

Probiere in einer Shell (unter X z.B. xterm, konsole, gnome-terminal, 
...), das aktuelle Verzeichnis zu wechseln und dann Dein Executable 
auszuführen, was std::filesystem::current_path() aufruft; z.B.
cd /
/home/user/Desktop/executable

und dann
cd /home/user/Desktop
/home/user/Desktop/executable

von C++Love (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ok danke vestehe, mein Ziel war der Pfad wo das Executable gespeichert 
ist. Hatte gedacht std::filesystem::current_path() liefert dies aber 
dann scheint std::filesystem das leider gar nicht zu beherrschen.

Mit /proc/self/exe funktioniert es :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.