IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

[D2010] Comment récupérer le répertoire temp de l'utilisateur courant ?


Sujet :

API, COM et SDKs Delphi

  1. #1
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 681
    Points : 7 116
    Points
    7 116
    Par défaut [D2010] Comment récupérer le répertoire temp de l'utilisateur courant ?
    Comment récupérer le répertoire temp de l'utilisateur courant ?
    >> C:\Documents and Settings\Moi\Local Settings\Temp\

    J'ai regardé dans la faq, je n'ai rien vu sur celui-là.

  2. #2
    Membre confirmé
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Février 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Belgique

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2006
    Messages : 537
    Points : 460
    Points
    460
    Par défaut
    Bonjour,
    je n'ai pas ce qu'il faut sous la main mais on sais connaître le nom de la session ouverte.
    De la ton chemin vers le dossier que tu cherches a la réponse à la variable qui te manquait.

    Si je me trompe c'est dû à l'heure de mise en réveil des neurones

  3. #3
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 681
    Points : 7 116
    Points
    7 116
    Par défaut
    Citation Envoyé par andreditdd Voir le message
    je n'ai pas ce qu'il faut sous la main mais on sais connaître le nom de la session ouverte.
    Ca oui. En attendant, j'ai pensé bidouiller avec. Mais, on commence à avoir des Windows 7, donc c'est une mauvaise idée. Le répertoire [Documents and Settings] n'existe plus.

    Citation Envoyé par andreditdd Voir le message
    De la ton chemin vers le dossier que tu cherches a la réponse à la variable qui te manquait.

    Si je me trompe c'est dû à l'heure de mise en réveil des neurones
    Pas compris.

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Le plus simple est surement d'accéder à la variable d'environnement TEMP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      TmpFolder := GetEnvironmentVariable('TEMP');
    @+ Claudius

  5. #5
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Points : 5 918
    Points
    5 918
    Par défaut
    Bonjour,

    La fonction Windows.GetTempPath(nBufferLength: DWORD; lpBuffer: PChar): DWORD; ne répond pas à ton besoin ?

    Sous D7 ou D2006, elle renvoie le chemin correct si ce n'est qu'il en format court (8.3).

    --
    Philippe.

  6. #6
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 681
    Points : 7 116
    Points
    7 116
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    La fonction Windows.GetTempPath(nBufferLength: DWORD; lpBuffer: PChar): DWORD; ne répond pas à ton besoin ?

    Sous D7 ou D2006, elle renvoie le chemin correct si ce n'est qu'il en format court (8.3).
    Moi, elle me renvoit ce répertoire :
    c:\Temp\
    Et ce n'est pas celui qu'il me faut.

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 466
    Points
    28 466
    Par défaut
    Citation Envoyé par Lung Voir le message
    Moi, elle me renvoit ce répertoire :

    Et ce n'est pas celui qu'il me faut.
    J'allais t'indiquer de regarder dans le registre
    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders

    mais Microsoft (je suppose) y a coller le texte suivant :
    !Do not use this registry key
    Use the SHGetFolderPath or SHGetKnownFolderPath function instead


  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function GetTempDossier: string;
    // cette fonction renvoie : le dossier temporaire de Windows en fonction des critères suivants:
    // 1.	le chemin spécifié par la variable d'environement TMP
    // 2.	le chemin spécifié par la variable d'environement TEMP  si TMP non défini
    // 3.	le dossier courant si aucune des deux variables TMP et TEMP ne sont définies
    var     Dossier: array[0..MAX_PATH] of Char;
    begin   result:='';
            if GetTempPath(SizeOf(Dossier), Dossier)<>0 then Result := GetLongFilename(StrPas(Dossier));
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin      showmessage(GetTempDossier);
    
    end;
    Variante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var       Temp : array[0..255] of Char; DossTemp : string;
    begin     // Dossier Temp
              GetEnvironmentVariable('TEMP', Temp, SizeOf(Temp)); // touver le nom-court du dossier Temp
              DossTemp:=GetLongFilename(Temp);
              ...
    end;
    A+.

  9. #9
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Points : 5 918
    Points
    5 918
    Par défaut
    Citation Envoyé par Lung Voir le message
    Moi, elle me renvoit ce répertoire : C:\Temp

    Et ce n'est pas celui qu'il me faut.
    Mouais, alors c'est autre chose qu'un répertoire temporaire que tu veux
    C'est un répertoire de stockage de données utilisateurs...

    Regardes cette fonction GetUserProfileDirectory

    et la base de registre :
    1. HKCU\Environment
    2. HKCU\Volatile Environment


    --
    Philippe.

  10. #10
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 681
    Points : 7 116
    Points
    7 116
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    !Do not use this registry key
    Use the SHGetFolderPath or SHGetKnownFolderPath function instead
    La msdn dit que SHGetFolderPath est dépréciée et qu'il faut utiliser SHGetKnownFolderPath. Le problème c'est que je ne sais pas comment définir FOLDERID_Profile.

    Citation Envoyé par Gilbert Geyer Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var       Temp : array[0..255] of Char; DossTemp : string;
    begin     // Dossier Temp
              GetEnvironmentVariable('TEMP', Temp, SizeOf(Temp)); // touver le nom-court du dossier Temp
              DossTemp:=GetLongFilename(Temp);
              ...
    end;
    Même si je n'ai pas vu de variable d'envirronement qui correspond pile à ce que je cherche, je peux au moins faire ça (mais que pour XP):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       GetEnvironmentVariable('USERPROFILE', Temp, nTaille);
       ShowMessage(String(Temp) + '\Local Settings\Temp\');


    Citation Envoyé par Ph. B. Voir le message
    Mouais, alors c'est autre chose qu'un répertoire temporaire que tu veux
    Oui. C'est pour ça que dans mon premier message, je demande :
    le répertoire temp de l'utilisateur courant


    Citation Envoyé par Ph. B. Voir le message
    Regardes cette fonction GetUserProfileDirectory
    J'obtiens ce message, alors que la msdn dit que cette fonction est dans cette DLL :
    Le point d'entrée de procédure GetUserProfileDirectory est introuvable dans la bibliothèque de liaisons dynamique Userenv.dll.

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 720
    Points : 25 617
    Points
    25 617
    Par défaut
    Citation Envoyé par Lung Voir le message
    La msdn dit que SHGetFolderPath est dépréciée et qu'il faut utiliser SHGetKnownFolderPath. Le problème c'est que je ne sais pas comment définir FOLDERID_Profile.


    SHGetKnownFolderPath function
    utilise KNOWNFOLDERID , et FOLDERID_Profile c'est une constante

    Dans mon C++Builder2007 (fichier Knownfolders.h) ça donne
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #define DEFINE_KNOWN_FOLDER(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
            EXTERN_C const GUID DECLSPEC_SELECTANY name \
                    = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }
     
    // {5E6C858F-0E22-4760-9AFE-EA3317B67173}
    DEFINE_KNOWN_FOLDER(FOLDERID_Profile,             0x5E6C858F, 0x0E22, 0x4760, 0x9A, 0xFE, 0xEA, 0x33, 0x17, 0xB6, 0x71, 0x73);

    ce qui donne en Delphi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // {5E6C858F-0E22-4760-9AFE-EA3317B67173}
      FOLDERID_Profile: TGUID                        = '{5E6C858F-0E22-4760-9AFE-EA3317B67173}';
      {$EXTERNALSYM FOLDERID_Profile}

    Ce n'est pas la 1ère fois que je lis que "Windows.GetTempPath" ne renvoie pas le bon chemin !
    Moi, j'ai eu des soucis avec GetSystemDirectory qui n'a jamais vraiment donné quelques choses de correct !

    Personnellement, sous XP, je n'ai jamais eu de problème, j'ai toujours eu "...\Local Settings\Temp\"

    Tu devrais tester sur différentes machines !

  12. #12
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 681
    Points : 7 116
    Points
    7 116
    Par défaut
    Je viens de re-jeter un oeil plus attentif sur la msdn. La fonction SHGetKnownFolderPath n'existe qu'à partir de vista.
    Donc, il faut que je trouve autre chose ...

    Citation Envoyé par ShaiLeTroll Voir le message
    Ce n'est pas la 1ère fois que je lis que "Windows.GetTempPath" ne renvoie pas le bon chemin !

    Personnellement, sous XP, je n'ai jamais eu de problème, j'ai toujours eu "...\Local Settings\Temp\"

    Tu devrais tester sur différentes machines !
    Bin oui mais, même s'il n'y a que quelques postes qui posent problème, c'est des postes de trop. Il me faut une solution qui fonctionne sur tout les postes.

  13. #13
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Bonsoir,

    Moi j'utilise la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var
      Path : array[0..MAX_PATH] of Char;
    begin
      //******* on récupère le chemin du bureau dans path
      if ShGetSpecialFolderPath(0, path, CSIDL_DESKTOP, False) then
    A toi de prendre le bon paramètre nFolder (ici CSIDL_DESKTOP), que se soit sous XP, seven 32 ou 64 je n'ai jamais eu de problème

    Bye

  14. #14
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 681
    Points : 7 116
    Points
    7 116
    Par défaut
    Pas mal !
    En attendant mieux, je crois que je vais rester sur ça pour XP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       function RepertoireSysteme(const nFolder: Integer): String;
       var
          SpecialPath: Array[0 .. MAX_PATH] of char;
       begin
          Result := '';
          if ShGetSpecialFolderPath(0, SpecialPath, nFolder, False) then
             Result := String(SpecialPath);
       end;
    ...
    RepertoireSysteme(CSIDL_PROFILE) + '\Local Settings\Temp\'

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/08/2010, 12h40
  2. Réponses: 2
    Dernier message: 12/02/2010, 14h34
  3. Réponses: 2
    Dernier message: 07/12/2006, 16h18
  4. Comment récupérer le répertoire parent d'un répertoire?
    Par Jayceblaster dans le forum Delphi
    Réponses: 14
    Dernier message: 23/05/2006, 19h38
  5. Comment récupérer le dossier temp en C++
    Par alainpeniche dans le forum Windows
    Réponses: 3
    Dernier message: 23/08/2005, 15h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo