¿Cómo se determina las rutas completas de los argumentos de la línea de comando del nombre de archivo en un programa C ++?

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

Pregunta

Estoy escribiendo un programa en C ++ que acepta un nombre de archivo como argumento en la línea de comando:

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

Sé que simplemente puedo abrir un fstream usando argv[1], pero el programa necesita más información sobre la ubicación exacta (es decir, el nombre de ruta completa) del archivo.

Pensé en agregar argv[1] a getcwd(), sin embargo, obviamente en el ejemplo anterior, terminarías con /path/../path/to/file.txt. No estoy seguro de si Fstream resolvería esa ruta automáticamente, pero incluso si lo hiciera, todavía no tengo la ruta completa sin mucho procesamiento de cadenas.

Por supuesto, ese método no funcionaría en absoluto si la ruta proporcionada ya fuera absoluta. Y dado que este programa puede ejecutarse en Linux/Windows/etc., simplemente detectar un carácter inicial '/' no funcionará para determinar si el argumento era una ruta completa o no.

Creo que este es un problema bastante común para lidiar con los nombres de las rutas en múltiples OSS. Asi que ¿Cómo se retira el nombre completo de la ruta de un argumento de línea de comando? y ¿Cómo se maneja esto entre los sistemas operativos??

¿Fue útil?

Solución

El manejo del nombre de ruta es altamente específico del sistema operativo: algunos OS tienen una jerarquía con solo una raíz (por ejemplo, UNIX), algunas tienen varias raíces a las letras de accionamiento de la MS-DOS; Algunos pueden tener enlaces simbólicos, enlaces duros u otros tipos de enlaces, lo que puede hacer que el recorrido sea difícil. Algunos ni siquiera tienen el concepto de una ruta "canónica" a un archivo (por ejemplo, si un archivo tiene enlaces difíciles, tiene múltiples nombres, ninguno de los cuales es más "canónico").

Si alguna vez ha intentado hacer la manipulación del nombre de ruta en múltiples OS en Java, sabe a qué me refiero :-).

En resumen, el manejo del nombre de ruta es específico del sistema, por lo que tendrá que hacerlo por separado para cada sistema operativo (familia) o usar una biblioteca adecuada.

Editar:

Podrías mirar Tiempo de ejecución portátil de Apache, o en BOOST (aunque C ++), ambos tienen funciones de manejo de rutas.

Otros consejos

... Terminarías con /path/../path/to/file.txt. No estoy seguro de si Fstream resolvería esa ruta automáticamente, pero incluso si lo hiciera, todavía no tengo la ruta completa sin mucho procesamiento de cadenas.

Lo hace, y puedes usar /path/../path/ para todo lo que quieras sin problemas.

De todos modos, no hay función estándar en C ++ para hacer lo que desea. Tendría que hacerlo manualmente, y no sería trivial ... le sugiero que mantenga el camino tal como es, no debería causar ningún problema.

Depende del sistema operativo. Si está utilizando Linux, puede mirar RealPath (). Sin duda Windows tiene algo comparable.

AFAIK no hay una forma estándar.

Sin embargo, podría probar este enfoque (escrito en pseudocódigo):

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

Pero tenga en cuenta: no estoy muy seguro de si hay problemas cuando entran en juego los enlaces simbólicos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top