Wie bestimmen Sie die vollständigen Pfade aus den Befehlszeilenargumenten der Dateinamen in einem C ++ - Programm?

StackOverflow https://stackoverflow.com/questions/2033908

Frage

Ich schreibe ein Programm in C ++, das einen Dateinamen als Argument in der Befehlszeile akzeptiert:

>> ./myprogram ../path/to/file.txt

Ich weiß argv[1], Das Programm benötigt jedoch weitere Informationen über den genauen Ort (dh vollständigen Pfadnamen) der Datei.

Ich dachte an eine Anhänge argv[1] zu getcwd(), Wie offensichtlich im obigen Beispiel Sie enden würden /path/../path/to/file.txt. Ich bin mir nicht sicher, ob Fstream diesen Pfad automatisch auflösen würde, aber selbst wenn dies der Fall wäre, habe ich immer noch nicht den vollständigen Pfad ohne viel String -Verarbeitung.

Natürlich würde diese Methode überhaupt nicht funktionieren, wenn der bereitgestellte Weg bereits absolut wäre. Und da dieses Programm unter Linux/Windows/usw. ausgeführt werden kann, wird einfach festgestellt, ob das Argument ein vollständiger Weg war oder nicht.

Ich würde denken, dass dies ein ziemlich häufiges Problem ist, um sich mit Pfadnamen über mehrere OSS hinweg zu befassen. So Wie kann man den vollständigen Pfadnamen eines Befehlszeilenarguments wiederholen? und Wie wird dies zwischen Betriebssystemen behandelt??

War es hilfreich?

Lösung

Die Handhabung von Pathname ist stark osspezifisch: Einige Betriebssysteme haben eine Hierarchie mit nur einer Wurzel (z. B. Unix), einige haben mehrere Wurzeln a la ms-dos-Antriebsbuchstaben; Einige können symbolische Links, harte Links oder andere Arten von Links haben, die das Durchqueren schwierig machen können. Einige haben möglicherweise nicht einmal das Konzept eines "kanonischen" Pfades zu einer Datei (z. B. wenn eine Datei harte Links hat, mehrere Namen enthält, von denen keiner "kanonischer" ist).

Wenn Sie jemals versucht haben, in Java über mehrere OS-Manipulation hinweg zu machen, wissen Sie, was ich meine :-).

Kurz gesagt, die Handhabung von Pathname ist systemspezifisch, sodass Sie es für jedes Betriebssystem (Familie) separat tun oder eine geeignete Bibliothek verwenden müssen.

Bearbeiten:

Sie könnten sich ansehen Apache tragbare Laufzeit, oder bei Boost (C ++) haben beide Pfadname -Handhabungsfunktionen.

Andere Tipps

... Sie würden mit /path/../path/to/file.txt enden. Ich bin mir nicht sicher, ob Fstream diesen Pfad automatisch auflösen würde, aber selbst wenn dies der Fall wäre, habe ich immer noch nicht den vollständigen Pfad ohne viel String -Verarbeitung.

Es tut, und Sie können /path/../path/ für alles, was Sie wollen, ohne Probleme verwenden.

Wie auch immer, es gibt keine Standardfunktion in C ++, um das zu tun, was Sie wollen. Sie müssten es manuell tun, und es wäre nicht trivial. Ich schlage vor, Sie halten den Weg so, wie er ist, es sollte keine Probleme verursachen.

Es ist osabhängig. Wenn Sie Linux verwenden, können Sie sich ansehen RealPath (). Zweifellos hat Windows etwas Vergleichbares.

Afaik Es gibt keinen Standardweg.

Sie können diesen Ansatz jedoch ausprobieren (geschrieben in Pseudocode):

string raw_dirname=get_directory_part(argv[1])
string basename=get_filename_part(argv[1])
string cwd=getcwd()
chdir(relative_dirname)
string absolute_dirname=getcwd()
chdir(cwd)
string absolute_filename=absulute_dirname + separator + basename

Aber Hinweis: Ich bin mir nicht ganz sicher, ob es Probleme gibt, wenn symbolische Links ins Spiel kommen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top