La Web del Programador: Comunidad de Programadores
 
    Pregunta:  17840 - PATH DONDE SE CORRE EL PROGRAMA
Autor:  Enrique Araúz
Buenas.

Quiciera ver si me pueden dar una ayuda en lo siguiente:

Necesito saber si en Lenguaje C existe algun comando que me permita saber desde que path se esta corriendo el programa.

Otra pregunta para aprobechar:
En tal caso de que si existe tal comando, como puedo concatenar esa direccion con la sintaxis del comando SPAWNL(Me permite llamar a un programa desde otro)

spawnl(P_WAIT,direccion,NULL)

Me refiero a que el campo que llame direccion tenga el path de donde se esta corriendo el programa concatenada con el nombre de un archivo cualquiera que quiera ejecutar.

Osea que direccion = PATH \ archivo.exe

  Respuesta:  Juan Manuel Mar
Saludos:

No se si sea el caso, pero hay una función en la libreria dir.h que te devuelve la ruta actual de tu aplicación, es:

getcwd

Función: Lee del sistema el nombre del directorio de trabajo.

Sintaxis: getcwd(directorio,tamañocad) /* Lee el directorio y la unidad */

Lo malo es que esto ahorita lo encontre en la red y no estoy en mi casa, así que no recuerdo bien si es la sintaxis correcta (lo siento es que tengo mala memoria), pero de cualquier manera revisa la ayuda de borland c++ (yo tengo la versión para ms-dos) y ahí te dan ejemplos, lo unico que tienes que hacer es declarar una cadena de suficiente tamaño para guardar la ruta devuelta, me parece que es CADENA=getcwd(); , lo siento no recuerdo, revisa eso por favor.
Para concatenar cadenas usa strcat(cadena_resultante, cadena_a_unir), revisa la documentacion por si me equivoco con eso que tengo una memoria fatal, solo un detalle extra:

Cuando concatenes cadenas siempre asegurate de limpiar la cadena resultante antes de unirlas por si acaso.

  Respuesta:  Iñaki Lopez
Hola...

La respuesta planteada por Oscar Vazquez seria perfecta si no fuese porque, si se ejecuta el programa desde un directorio por debajo del que lo contiene... el contenido de "argv[0]" no es una ruta absoluta, es relativa... :(

Ej:
Resultado esperado:
archivo a ejecutar: "c:\prog\app.exe"
ejecutamos desde: "d:\pepe\"
"argv[0]" contendra: "c:\prog\app.exe"

Resultado no esperado:
archivo a ejecutar: "c:\prog\app.exe"
ejecutamos desde: "c:\prog\pepe\tmp\"
"argv[0]" contendra: "..\..\app.exe"

Llevo bastante tiempo intentando encontrar algo que funcione
bien en cualquier ambiente (Dos/W9x/WNT/WMe/W2k/WXP)... ya
que es evidente que la funcion "getcwd()" no sirve de nada en Windows porque el directorio activo puede ser cualquiera.

Si alguien tiene una solucion clara y definitiva para esto... por favor, la exponga aqui... yo hare lo mismo si encuentro algo.

Gracias por la ayuda, y perdon por esta respuesta que no es tal... :)

  Respuesta:  Oscar Vazquez
Toda aplicación C tiene una función "main".
Este es la declaración completa
int main( int argc, char *argv[ ], char *envp[ ] )

argc - Indica la cantidad de parámetros que recibe
argv - Cada uno de los parámetros recibidos
envp - La lista de las variables de entorno del sistema
(en DOS - set varname=valor)

El valor mínimo de argc es 1, indicando que al menos recibe un parámetro. Este parámetro corresponde al path completo de la aplicación que se está efecutando.

al ejecutar C:\path\subpath\app.exe, el parámetro argv[0] contiene el siguiente valor "c:\path\subpath\app.exe"

Esta función devuelve cada una de las partes del path de un archivo
void splitpath( const char *path, char *drive, char *dir, char *fname, char *ext );

En el ejemplo anterior obtendrías:
drive= "c:"
dir = "\path\subpath"
fname="app"
ext=".exe";

Esta función te permite realizar la tarea inversa
void _makepath( char *path, const char *drive, const char *dir, const char *fname, const char *ext );