%userprofile% en language c ?

Résolu
Bonjour,
je souhaite creer un petit programme permetant de creer un nouveau dossier dans les dosier utilistateur (documents and settings sous xp ou users sous vista).
Sous xp comme vista, lorsque lon tape %userprofile% dans la barre dadresse on arrive dans le compte de l'utilisateur en cour (du genre C:\Users\baibounet29 sous vista).
jai essayer la commande "mkdir("%USERPROFILE%\\Documents\\TEST31");" mais ca ne marche pas par contre si je tape "mkdir("C:\\Users\\baibounet29\\Documents\\TEST31");" ca marche.
Quelqu'un aurait il la soluce pour que cela marche quelquesoit le nom dutilisateur en cour ?
merci

--
X200-21E ! ! !
T7500 ; 8700M GT 512MO ; HDD 7200t/min 16MO cache ; 4GO Ram GSKILL 4-4-4-12 ; Vista 64bit
Configuration: Windows Vista
Internet Explorer 7.0

22 réponses

Résumé de la discussion

Le fil porte sur la création d'un nouveau dossier dans le répertoire utilisateur, identique sous XP et Vista, et sur l’usage de la variable d’environnement USERPROFILE plutôt qu’un chemin codé. Plusieurs répondants recommandent d’obtenir la valeur de USERPROFILE via getenv et de construire dynamiquement le chemin, ce qui permet d’adresser le répertoire courant sans connaître le nom d’utilisateur. En fonction du système, le chemin de base peut être XP ou Vista, mais la récupération via USERPROFILE reste valable et portable entre les deux systèmes. D’autres échanges évoquent l’usage de fonctions C comme getenv pour récupérer USERPROFILE et snprintf pour assembler le chemin, avec attention à la gestion de la taille des chaînes et des retours chariot.

Bobot (l’IA à votre service)
  1. Je remercie encore un fois tout ceux qui m'ont aider.
    et je pense que je vais arreter de vous embeter ! ;-)
    1. et sous xp tu saurais comment faire ?
      en tout cas merci de toute ton aide
      1. Contributeur
        Quand je dis cette plate-forme, je groupe tous les OS de Microsoft. Mais, sur Google, ça doit relativement bien se trouver. Peut-être que tu auras des infos ici : https://www.developpez.com/ et les pages qui suivent.
        Cdlt
    2. le pb le la taille n'en ai pas un dans cette partie ! ! ! ^^
      la je suis sous vista 64 (comme ecrit sur mon petit profil ci dessous ! ! !), tu ve dire que ca ne marchera pas pareil sous xp que sous vista (le prog ne tournera que sur des windobe de toute facon).
      1. Contributeur
        le pb le la taille n'en ai pas un dans cette partie ! ! ! ^^
        Ben, si. A partir du moment que tu utilises scanf comme tu l'as fait (sans indication de la taille). Tu autorises l'utilisateur à écrire une chaîne de la longueur qu'il veut, et comme il n'y a pas de contrôle de la taille, il pourra déborder et écrire dans la pile. Ce qui peut soit provoquer un crash, soit déclencher un code avec les droits du logiciel (dangereux si en administrateur). Enfin, c'est ton programme, c'est toi qui décide ;)

        la je suis sous vista 64
        Eh bien, je peux pas t'aider ^^. Faut regarder la doc sur google, ou attendre quelqu'un qui connaisse le développement sur cette plate-forme ;).

        Bonne chance
    3. Contributeur
      scanf ("%s" , &profil); N'oublie pas qu'il ne faut pas mettre l'esperluette (&) pour les chaînes de caractères ;)
      Sinon, non tu n'as toujours pas réglé le problème de la taille. Dans ta fonction scanf, il n'y a pas la présence de la taille.

      Sinon, pour ouvrir un répertoire, et tout, ce n'est pas du C pur, mais cela dépend de ton OS. Donc, faudrait voir de ce côté. Tu utilises quel OS ?

      Cdlt
      1. en faite ca marrange que le fichier se crée dans le dossier du programme !
        comment je pourrais faire pour le copier dans mon dossier test31\"profil" quelquesoit le dossier où se trouve le fichier source?
        1. oui c bon jai regler le probleme de la taille !
          jai un autre petit probleme. jarrive a creer a fichier texte avec ce code .
          scanf ("%s" , &profil);
          sprintf(profil2,"%s",profil);
          sprintf((char *) &profil,"active.txt");
          f = fopen(profil,"w");
          fprintf(f,"%s",profil2);
          mais il se creer dans le dossier où se trouve mon programme. vous noriez pas une idee pour le creer, ou tout du moin le copier, dans un autre dossier (le dossier que vous m'avez deja aider a creer !^^) .
          (Jai lu qu'il nexiste pas de fonction en c pour copier un fichier).
          merci
          1. Contributeur
            Si tu utilises ton scanf, n'oublie pas de spécifier la taille quand même sinon, ça peut faire du dégât ;)
            1. jai fait un printf et je voyais pas de soucis apparent ..
              en fait le pb de : fgets(profil,sizeof profil, stdin); est qu'il prend en compte le retour a la ligne ...
              je l'ai juste donc remplacer par un simple scanf !
              Merci
              1. oui et tu pourra recuperer la bibli string.h de talleur en meme temp ! !
                heu .. en fait ... desoler mais ca marche pô.... aucun dossier creer dans test31..
                1. Modérateur
                  Fait voir un printf(profil) pour voir (après le sprintf).
              2. merci !
                mais newchaine sert a quoi ? elle est a utilisee
                1. Contributeur
                  Lol. Il sert à rien. Au début, j'étais parti autrement et j'avais besoin d'une autre variable. Mais j'ai oublié d'effacer ^^.
                2. Modérateur
                  @fiddyGarde là!! On ne sait jamais...

                  Les temps sont durs tu sais....
              3. Contributeur
                Re,
                char profil[255];
                char newChaine[512];
                
                fgets(profil,sizeof profil, stdin);
                sprintf(profil,"%s\\test31\\%s",q,profil);
                mkdir(profil);
                
                

                Cdlt
                1. maintenant que q=c:\\user\\baibounet29
                  en supposant que le dossier c:\user\baibounet29\test31 existe, est ce qu'on pourrais faire un truc du genre:

                  char profil[255]
                  scanf ("%s" , &profil);
                  mkdir ("%s\\test31\\%s", q, profil)

                  afin de creer un dossier c:\users\baibounet29\test31\toto (en supposant que lutilisateur ai taper toto !)
                  merci
                  1. merci a kilian et a fiddy ! !(aussi aux autre mais un peu moin !)
                    fiddy ton code marche nikel ! (mais je comprend pas pourkoi il y a 2 string.h ! lol!)
                    1. Modérateur
                      mais je comprend pas pourkoi il y a 2 string.h

                      On sait jamais! ;-)
                      Surtout en ce moment avec la crise, vaut mieux manquer de rien....
                    2. Contributeur
                      Oui c'est la crise.
                      En plus, gcc est un peu vieux, donc il faut répéter ;)
                  2. Contributeur
                    Si kilian apporte ses corrections, je le fais aussi :d ^^.
                    #include <stdio.h>
                    #include <string.h>
                    #include <dir.h>
                    #include <string.h>
                    
                    int main()
                    {
                        char p[51],q[51];
                        int i, n, r=0;
                        strncpy(p,getenv ( "USERPROFILE" ),sizeof p);
                        p[sizeof(p) -1]='\0';
                        for (i=0;i<50;i++){
                            n=i+r;
                            if (p[i]!='\\')
                               q[n]=p[i];
                            else {
                                q[n]=p[i];
                                r=r+1;
                                q[n+1]='\\';}
                          }
                    
                        printf ("finish-> %s", q);
                    
                        return 0;
                    }
                    
                    
                    1. Modérateur
                      Alors reprenons:
                      #include <stdio.h>
                      #include <string.h>
                      #include <dir.h>
                      
                      int main()
                      {
                          char *p,*q;
                          int i, n, r=0;
                          p = getenv ( "USERPROFILE" );
                          for (i=0;i<50;i++){
                              n=i+r;
                              if (p[i]=!'\\')
                                 q[n]=p[i];
                              else {
                                  q[n]=p[i];
                                  r=r+1;
                                  q[n+1]='\\';}
                            }
                      
                          printf ("finish-> %s", q);
                      
                          return 0;
                      }


                      D'abord, q ne pointe sur rien, donc ça va crasher. Ensuite c'est != et pas =! et enfin je ne comprends pas ce que tu veux faire :-)
                      1. jai essayer ce ke tu ma dit (enfin... je crois... si jme suis pa trompé!)
                        heuuuu jvai paraitre casse co..lle mais personne ne pourrais pas juste corriger mon truc ?
                        merci encor
                        1. Modérateur
                          Poste voir ton code actuel entre les balises code!
                      2. Jai vraimentl'impression d'etre une cave..
                        #include <stdio.h>
                        #include <string.h>
                        #include <dir.h>

                        int main(){
                        char *p,*q;
                        int i, n, r=0;
                        p = getenv ( "USERPROFILE" );
                        for (i=0;i<50;i++){
                        n=i+r;
                        if (p[i]=!'\\')
                        q[n]=p[i];
                        else {
                        q[n]=p[i];
                        r=r+1;
                        q[n+1]='\\';}

                        }

                        printf ("finish-> %s", q);

                        return 0;
                        }

                        ca devrait me doner "finish-> C:\\Users\\Baibounet29"
                        nn ?

                        1. Contributeur
                          Ceci devrait plutôt te retourner un segfault.
                          char *p = getenv ( "USERPROFILE" );
                          Pas le droit de modifier p.

                          Je te conseille donc de plutôt faire :
                          char p[50]; //50 ou plus, tu mets le nombre que tu veux. Si tu veux absolument contenir toute la chaîne quelque soit la taille, utilise l'allocation dynamique (malloc)
                          strncpy=getenv("USERPROFILE",sizeof p);
                          

                          Même remarque pour q. Utilise plutôt char q[50]; //voir même plus que la taille de p puisqu'il va contenir des doubles backslashs au lieu de simple.

                          Cdlt
                      3. Il ne faut pas utiliser USERPROFILE, mais l'api Win32.
                        demander sur le newsgroup professionnel des apis win32 :
                        news://194.177.96.26/fr.comp.os.ms-windows.programmation
                        où cela a souvent été discuté (C, C++, etc)
                        1. Modérateur
                          Il ne faut pas utiliser USERPROFILE, mais l'api Win32.

                          Pourquoi? S'il veut porter son code sous linux, il a juste à adapter pour mettre HOMEDIR à la place de userprofile, alors que s'il utilise l'api win32 c'est un autre bordel, c'est moi qui te le dis...
                      4. je pense que si jarrivai a modifier p (c:\users\baibounet29 ) pour qu'il devienne c:\\users\\baibounet29 ca marcherait
                        malheuresement ma methode habituelle de detection de caractere (if (p[i]=='\')) ne marche pas ...
                        enfin bon ... si vous pouviez maider a creer un prog en c permettant de creer un fichier TEST31 quelque soit lutilisateur dans %profiluser%\documents\
                        Merci
                        1. Contributeur
                          essaye avec (if (p[i]=='\\') ou (if (p[i]== 0x5c)
                      5. heu ... ji arrive pa !
                        jai bien verifier le chemin et ca marche printf ("%s", p); -> c:\users\baibounet29
                        mais je vois pas comment l'intergrer ds mkdir...
                        mkdir ("p\\documents\\test31") ne cree pas de dossier
                        et mkdir ("%s\\documents\\test31", p) ne marche pas (too many arguments)...
                        --
                        X200-21E ! ! !
                        T7500 ; 8700M GT 512MO ; HDD 7200t/min 16MO cache ; 4GO Ram GSKILL 4-4-4-12 ; Vista 64bit
                        1. Modérateur
                          Salut,

                          sprintf crée le formatage mais fout le bouzin dans une chaine au lieu de l'afficher à l'écran ;-)
                          char bidule[100];
                          sprintf(bidule, "%s/suitechemin", getenv("username"));
                          mkdir(bidule);
                      • 1
                      • 2