Come si fa a determinare percorsi completi di argomenti della riga di comando il nome del file in un programma C ++?

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

Domanda

Sto scrivendo un programma in C ++ che accetta un nome di file come argomento sulla riga di comando:

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

So che posso semplicemente aprire un fstream utilizzando argv[1], ma il programma ha bisogno di più informazioni sulla posizione esatta (es. Percorso completo) del file.

ho pensato aggiungendo argv[1] per getcwd(), però, ovviamente, nell'esempio di cui sopra che ci si finisce con /path/../path/to/file.txt. Non è sicuro se fstream risolverebbe quel percorso automaticamente, ma anche se lo ha fatto, io ancora non hanno il percorso completo senza un sacco di elaborazione delle stringhe.

Naturalmente, questo metodo non funziona affatto se il percorso previsto era già assoluto. E dal momento che questo programma può essere eseguito su Linux / Windows / etc, semplicemente rilevando una partenza '/' carattere non funzionerà per determinare se l'argomento è stato un percorso completo o meno.

Vorrei che questo è un problema abbastanza comune a che fare con i nomi di percorso su più sistemi operativi. Quindi, come si fa a prelevare il percorso completo di un argomento di riga di comando e come viene gestito da un sistema operativo

È stato utile?

Soluzione

movimentazione Nome percorso è altamente-OS specifici: alcuni sistemi operativi hanno una gerarchia con un solo root (per esempio / su Unix), alcuni hanno molte radici lettere di unità a la MS-DOS'; alcuni possono avere collegamenti simbolici, hard link o altri tipi di collegamenti, che possono rendere difficile l'attraversamento. Alcuni non possono nemmeno avere il concetto di un percorso "canonica" in un file (ad esempio, se un file ha hard link, ha più nomi, nessuno dei quali è più "canonico").

Se hai mai provato a fare nome-percorso attraverso la manipolazione del sistema operativo più in Java, sai cosa voglio dire: -).

In breve, la manipolazione percorso è specifiche del sistema, in modo da dovrete farlo separatamente per ogni sistema operativo (famiglia), o utilizzare una libreria adatta.

Modifica :

Si potrebbe guardare a Apache Portable Runtime , o Boost (C ++ però), sia avere funzioni di gestione del percorso.

Altri suggerimenti

  

... che ci si finisce con /path/../path/to/file.txt. Non sono sicuro   se fstream risolverebbe che   percorso automaticamente, ma anche se   fatto, io ancora non ho il percorso completo   senza un sacco di elaborazione delle stringhe.

Essa, ed è possibile utilizzare /path/../path/ per tutto quello che volete, senza problemi.

In ogni caso non v'è alcuna funzione standard in C ++ per fare quello che vuoi. Sarebbe necessario farlo manualmente, e non sarebbe banale .. Io suggerisco di tenere il percorso come è, non dovrebbe causare problemi.

E 'dipende dal sistema operativo. Se si utilizza Linux si può guardare a realpath () . Non c'è dubbio che Windows ha qualcosa di paragonabile.

Per quanto ne sappia non esiste un modo standard.

tuttavia si potrebbe provare questo approccio (scritto in pseudocodice):

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

, ma nota:. Non sono del tutto sicuro se ci sono problemi quando link simbolici entrano in gioco

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top