1

voila la question est simple: peut on obtenir le répertoire dans lequel ce trouve le programme(pas le répertoire courant) de manière a le définir comme répertoire courant
avatar

2

Ce n'est p-ê pas parfait (en fait ça ne l'est pas, en tout cas sur un Unixoïde c possible d'avoir un ":" dans un nom de répertoire dans le PATH, à condition de mettre des guillemets autour), mais voilà ce que je fais dans GTC :
		char *gtcpath=alloca(strlen(argv[0])+40);
		strcpy(gtcpath,argv[0]);
		if (strrchr(gtcpath,DIR_SEPARATOR)) strrchr(gtcpath,DIR_SEPARATOR)[1]=0;	// strip 'gtc.exe'
		else {
#if 0
			gtcpath="";	// 'gtc.exe' is in the current folder... (this assumption is OK under Win9x)
#else
			// things don't stop here as WinXP sets argv[0] to be 'gtc.exe' if it is in the
			// PATH environment variable... (and the same goes for Unixoids)
			char *path=getenv("PATH");
			while ((gtcpath="",path)) {
				char *limit=strchr(path,ENVPATH_SEPARATOR),*base_limit=limit; char *buf;
				FILE *fp;
				if (!limit) limit=path+strlen(path);
				if (path[0]=='"' && path[limit-path-1]=='"')
					path++,limit--;
				gtcpath=alloca(limit-path+2);
				memcpy(gtcpath,path,limit-path); gtcpath[limit-path]=DIR_SEPARATOR; gtcpath[limit-path+1]=0;
				buf=alloca(strlen(gtcpath)+20);
				sprintf(buf,"%sgtc.exe",gtcpath);
				if ((fp=fopen(buf,"rb"))) {
					fclose(fp);
					break;
				}
		#ifndef _WIN32
				sprintf(buf,"%sgtc",gtcpath);
				if ((fp=fopen(buf,"rb"))) {
					fclose(fp);
					break;
				}
		#endif
				path = base_limit ? base_limit+1 : NULL;
			}
#endif
		}

avec
#ifdef PC
#ifdef _WIN32
#define DIR_SEPARATOR '\'
#define ENVPATH_SEPARATOR ';'
#else
#ifdef UNIXOID
#define DIR_SEPARATOR '/'
#define ENVPATH_SEPARATOR ':'
#else
#error Please define a directory and a $PATH separator for your platform.
#endif
#endif
#endif

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

3

s'il est dans le path, system("which argv[0]") (enfin avec un sprintf...) marche pas ?
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

4

Ok y'a pas de méthodes propres de de faire ca?

C'avais déjà pensé a un truc comme ca mais je savais pas que argv[0] pouvait contenir le chemin complet.
Merci Pollux
avatar

5

Sous Linux (mais vraiment "Linux" et pas *nix!), il y a une entrée /proc pour ça, et sous Windows une fonction de l'API Win32. Mais partout ailleurs, il n'y a que ce hack.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

6

- Sous windows tu peux utiliser GetModuleFileName ('tention, si tu fais une dll, ça sort le chemin de la dll, pas de l'executable).
- Sous d'autres systèmes, tu peux utiliser argv[0], comme les autres l'ont dit au-dessus (ah, un détail quand même : en principe si tu veux juste définir le répertoire courant pour être à l'identique de l'image de programme, normalement t'as pas besoin de fouiller dans le path, argv[0] contient assez d'infos).
- Si tu utilises Qt, tu peux utiliser qApp->applicationDirPath() (en fait ils utilisent l'une des deux approches ci-dessus selon la plateforme).

7

spectras
: ah, un détail quand même : en principe si tu veux juste définir le répertoire courant pour être à l'identique de l'image de programme, normalement t'as pas besoin de fouiller dans le path, argv[0] contient assez d'infos

Non, pas du tout. argv[0] contiendra en général seulement le nom de ton programme (par exemple "gcc") et aucune information sur l'endroit où il se trouve. Donc obligé de fouiller le PATH, ou d'utiliser /proc (qui contient un "fichier" fonctionnant comme GetModuleFileName, mais sous Linux seulement).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

8

Ah pardon, oui je pensais à un chemin relatif ou absolu, mais au moment où j'ai écrit j'en ai oublié le path. neutral

9

de toute facon dans mon cas le programe ne devais pas ce trouve dans un répertoire de PATH donc je me suis permi une version très alégée de ce qu'a posté Pollux
avatar