Convertir un dossier spécial en chemin d'accès
Règles du forum
- Merci de consulter la section "Règles du forum" et plus particulièrement "Règles et Mentions Légales du site autoitscript.fr" avant d'écrire un message.
-
- Niveau 5
- Messages : 177
- Enregistré le : sam. 21 mars 2009 17:57
- Localisation : Bretagne
- Status : Hors ligne
Convertir un dossier spécial en chemin d'accès
Bonjour,
Lorsque l'on utilise la fonction FileSelectFolder sur un dossier spécial de Windows (Mes Documents, Mes images...), la fonction FileSelectFolder ne retourne pas un chemin d'accès classique, mais quelque chose comme :
::{031€4825-7B94-4DC3-B131-E946B44C8DD5}\Documents.library-ms
Existe t il une fonction qui me permettrait de récupérer le chemin d'accès de type C:\Users\user\Documents ?
Merci
Eric
Lorsque l'on utilise la fonction FileSelectFolder sur un dossier spécial de Windows (Mes Documents, Mes images...), la fonction FileSelectFolder ne retourne pas un chemin d'accès classique, mais quelque chose comme :
::{031€4825-7B94-4DC3-B131-E946B44C8DD5}\Documents.library-ms
Existe t il une fonction qui me permettrait de récupérer le chemin d'accès de type C:\Users\user\Documents ?
Merci
Eric
Re: Convertir un dossier spécial en chemin d'accès
Bonjour,
Tu peux t'inspirer des Macros deja présentes dans le langage.
@AppDataDir Path to current user's Roaming Application Data
@LocalAppDataDir Path to current user's Local Application Data
@DesktopDir Path to current user's Desktop
@MyDocumentsDir Path to My Documents target
@FavoritesDir Path to current user's Favorites
@ProgramsDir Path to current user's Programs (folder on Start Menu)
@StartMenuDir Path to current user's Start Menu
@StartupDir current user's Startup folder
@UserProfileDir Path to current user's Profile folder.
Cdlt, Dimvar.
Tu peux t'inspirer des Macros deja présentes dans le langage.
@AppDataDir Path to current user's Roaming Application Data
@LocalAppDataDir Path to current user's Local Application Data
@DesktopDir Path to current user's Desktop
@MyDocumentsDir Path to My Documents target
@FavoritesDir Path to current user's Favorites
@ProgramsDir Path to current user's Programs (folder on Start Menu)
@StartMenuDir Path to current user's Start Menu
@StartupDir current user's Startup folder
@UserProfileDir Path to current user's Profile folder.
Cdlt, Dimvar.
N'évoquons pas la pierre, les jeunes risqueraient d'en poire !
-
- Niveau 5
- Messages : 177
- Enregistré le : sam. 21 mars 2009 17:57
- Localisation : Bretagne
- Status : Hors ligne
Re: Convertir un dossier spécial en chemin d'accès
Bonjour Dimvar,
Oui, mais comment obtenir le chemin d'accès réel à partir de ce que me retourne Fileselectfolder.
L'idée, c'est qu'au lieu d'avoir ::{031€4825-7B94-4DC3-B131-E946B44C8DD5}\Documents.library-ms je puisse obtenir un chemin du type C:\Users\user\Document pour pouvoir noter ce chemin dans un fichier ou dans une listview par exemple.
Je ne sais pas à l'avance si l'utilisateur va choisir Documents ou Images ou autre chose.
Merci
Eric
Oui, mais comment obtenir le chemin d'accès réel à partir de ce que me retourne Fileselectfolder.
L'idée, c'est qu'au lieu d'avoir ::{031€4825-7B94-4DC3-B131-E946B44C8DD5}\Documents.library-ms je puisse obtenir un chemin du type C:\Users\user\Document pour pouvoir noter ce chemin dans un fichier ou dans une listview par exemple.
Je ne sais pas à l'avance si l'utilisateur va choisir Documents ou Images ou autre chose.
Merci
Eric
Re: Convertir un dossier spécial en chemin d'accès
En effet, j'ai du répondre un peu rapidement.
C'est un pb de CLSID lié à ta version de Windows. Je t'invite à te rapprocher de la doc où ils précisent ce point.
Un fil anglais sur le sujet abordé :
https://www.autoitscript.com/forum/topi ... ectfolder/
C'est un pb de CLSID lié à ta version de Windows. Je t'invite à te rapprocher de la doc où ils précisent ce point.
Un fil anglais sur le sujet abordé :
https://www.autoitscript.com/forum/topi ... ectfolder/
N'évoquons pas la pierre, les jeunes risqueraient d'en poire !
-
- Niveau 5
- Messages : 177
- Enregistré le : sam. 21 mars 2009 17:57
- Localisation : Bretagne
- Status : Hors ligne
Re: Convertir un dossier spécial en chemin d'accès
Ah ouais, visiblement cela semble plus compliqué que ce que j'avais imaginé.
- Tlem
- Site Admin
- Messages : 11784
- Enregistré le : ven. 20 juil. 2007 21:00
- Localisation : Bordeaux
- Status : Hors ligne
Re: Convertir un dossier spécial en chemin d'accès
Bonsoir.
Sinon, voici une petite fonction spéciale pour vous. ^^
Sinon, voici une petite fonction spéciale pour vous. ^^
Code : Tout sélectionner
#include <WinAPIShellEx.au3>
ConsoleWrite(GetRealPath("::{031€4825-7B94-4DC3-B131-E946B44C8DD5}\Documents.library-ms") & @CRLF)
ConsoleWrite(GetRealPath("D:\Users\User\Desktop\Documents.library-ms") & @CRLF)
Func GetRealPath($sPath)
Local $aPath = StringRegExp($sPath, "({.*})(.*)", 1)
; Si le chemin n'est pas composé d'un chemin spécial, on retourne le chemin initiale.
If @Error Then Return $sPath
; Sinon on retourne le chemin converti
Return _WinAPI_ShellGetSpecialFolderPath($aPath[0]) & $aPath[1]
EndFunc
Thierry
Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...
Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...
Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
-
- Niveau 5
- Messages : 177
- Enregistré le : sam. 21 mars 2009 17:57
- Localisation : Bretagne
- Status : Hors ligne
Re: Convertir un dossier spécial en chemin d'accès
Bonjour,
Merci Thierry,
Je vais tester ce code.
Cordialement
Eric
Merci Thierry,
Je vais tester ce code.
Cordialement
Eric
-
- Niveau 5
- Messages : 177
- Enregistré le : sam. 21 mars 2009 17:57
- Localisation : Bretagne
- Status : Hors ligne
Re: Convertir un dossier spécial en chemin d'accès
Je dois mal me servir de la commande _WinAPI_ShellGetSpecialFolderPath parce que, quel que soit le CLSID que je mets, j'obtiens toujours le chemin vers le bureau.
J'ai testé depuis la liste des CLSID de cette page :
https://www.autoitscript.fr/autoit3/doc ... /clsid.htm
Me retourne sur mon PC : C:\Users\user\Desktop
Me retourne aussi sur mon PC : C:\Users\user\Desktop
C'est bizarre !
J'ai testé depuis la liste des CLSID de cette page :
https://www.autoitscript.fr/autoit3/doc ... /clsid.htm
Code : Tout sélectionner
#include <WinAPIShellEx.au3>
$dossier = _WinAPI_ShellGetSpecialFolderPath("::{21EC2020-3AEA-1069-A2DD-08002b30309d}") ;(normalement Control Panel)
MsgBox(4096,"",$dossier)
Code : Tout sélectionner
#include <WinAPIShellEx.au3>
$dossier = _WinAPI_ShellGetSpecialFolderPath("::{7be9d83c-a729-4d97-b5a7-1b7313c39e0a}") ;(normalement Programs Folder)
MsgBox(4096,"",$dossier)
C'est bizarre !
- Tlem
- Site Admin
- Messages : 11784
- Enregistré le : ven. 20 juil. 2007 21:00
- Localisation : Bordeaux
- Status : Hors ligne
Re: Convertir un dossier spécial en chemin d'accès
Bonsoir.
Effectivement, il semble que je soit aller un peut vite en besogne ...
La valeur d'entrée de la fonction
Après quelques recherches, je suis tombé sur ça : https://docs.microsoft.com/en-us/window ... wnfolderid
Lorsque j'ai vu l'exemple de la fonction, j'ai cru que les variables
Je n'ai malheureusement pas trouvé comment faire le lien entre le CLSID (GUID) et le CSIDL.
Désolé pour la fausse joie.
Effectivement, il semble que je soit aller un peut vite en besogne ...

La valeur d'entrée de la fonction
_WinAPI_ShellGetSpecialFolderPath()
doit être un CSIDL !!!Après quelques recherches, je suis tombé sur ça : https://docs.microsoft.com/en-us/window ... wnfolderid
Lorsque j'ai vu l'exemple de la fonction, j'ai cru que les variables
$CSIDL_WINDOWS, $CSIDL_SYSTEM, $CSIDL_FONTS
correspondaient à des CLSID (GUID), mais visiblement ce n'est pas le cas car dans le fichier APIShellExConstants.au3 les valeurs sont tel que ceci :Je n'ai malheureusement pas trouvé comment faire le lien entre le CLSID (GUID) et le CSIDL.
Désolé pour la fausse joie.

Thierry
Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...
Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...
Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
- walkson
- Modérateur
- Messages : 1037
- Enregistré le : ven. 12 août 2011 19:49
- Localisation : Hurepoix
- Status : Hors ligne
Re: Convertir un dossier spécial en chemin d'accès
Bonjours
Ce n'est pas cette fonction
si je me réfère aux variables comme
Global Const $FOLDERID_Cookies = '{2B0F765D-C0E9-4171-908E-08A611B84FF6}'
Global Const $FOLDERID_Desktop = '{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}'
Global Const $FOLDERID_DeviceMetadataStore = '{5CE4A5E9-E4EB-479D-B89F-130C02886155}'
Global Const $FOLDERID_DocumentsLibrary = '{7B0DB17D-9CD2-4A93-9733-46CC89022E7C}'
Global Const $FOLDERID_Downloads = '{374DE290-123F-4565-9164-39C4925E467B}'
Global Const $FOLDERID_Favorites = '{1777F761-68AD-4D8A-87BD-30B759FA33DD}'
Global Const $FOLDERID_Fonts = '{FD228CB7-AE11-4AE3-864C-16F3910AB8FE}' etc....
dans APIShellExConstants.au3
Ce n'est pas cette fonction
_WinAPI_ShellGetKnownFolderPath()
qu'il faut ?si je me réfère aux variables comme
Global Const $FOLDERID_Cookies = '{2B0F765D-C0E9-4171-908E-08A611B84FF6}'
Global Const $FOLDERID_Desktop = '{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}'
Global Const $FOLDERID_DeviceMetadataStore = '{5CE4A5E9-E4EB-479D-B89F-130C02886155}'
Global Const $FOLDERID_DocumentsLibrary = '{7B0DB17D-9CD2-4A93-9733-46CC89022E7C}'
Global Const $FOLDERID_Downloads = '{374DE290-123F-4565-9164-39C4925E467B}'
Global Const $FOLDERID_Favorites = '{1777F761-68AD-4D8A-87BD-30B759FA33DD}'
Global Const $FOLDERID_Fonts = '{FD228CB7-AE11-4AE3-864C-16F3910AB8FE}' etc....
dans APIShellExConstants.au3
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
-
- Niveau 5
- Messages : 177
- Enregistré le : sam. 21 mars 2009 17:57
- Localisation : Bretagne
- Status : Hors ligne
Re: Convertir un dossier spécial en chemin d'accès
Bonjour Walkson,
Merci pour l'idée mais _WinAPI_ShellGetKnownFolderPath ne semble pas accepter de CLSID comme paramètre. Si j'essaie cela retourne une chaîne vide et @error <> 0
Mince, moi qui pensais que cela n'allait être qu'une formalité, je ne m'imaginais pas que cela pourrait-être aussi complexe.
Merci pour l'idée mais _WinAPI_ShellGetKnownFolderPath ne semble pas accepter de CLSID comme paramètre. Si j'essaie cela retourne une chaîne vide et @error <> 0
Mince, moi qui pensais que cela n'allait être qu'une formalité, je ne m'imaginais pas que cela pourrait-être aussi complexe.
-
- Niveau 5
- Messages : 177
- Enregistré le : sam. 21 mars 2009 17:57
- Localisation : Bretagne
- Status : Hors ligne
Re: Convertir un dossier spécial en chemin d'accès
A tout hasard, je vais essayer de poser la question sur le forum anglais.
- walkson
- Modérateur
- Messages : 1037
- Enregistré le : ven. 12 août 2011 19:49
- Localisation : Hurepoix
- Status : Hors ligne
Re: Convertir un dossier spécial en chemin d'accès
essayez
ou
Code : Tout sélectionner
#include <WinAPIShellEx.au3>
;>> en se basant sur les variables de APIShellExConstants.au3 ex: Global Const $FOLDERID_AddNewPrograms = '{DE61D971-5EBC-4F02-A3A9-6C82895E5C04}'
MsgBox(0, '1',_WinAPI_ShellGetKnownFolderPath($FOLDERID_PublicLibraries))
MsgBox(0, '2',_WinAPI_ShellGetKnownFolderPath('{48DAF80B-E6CF-4F4E-B800-0E69D84EE384}'))
MsgBox(0, '3',_WinAPI_ShellGetKnownFolderPath('{AE50C081-EBD2-438A-8655-8A092E34987A}'))
MsgBox(0, '4',_WinAPI_ShellGetKnownFolderPath('{352481E8-33BE-4251-BA85-6007CAEDCF9D}'))
MsgBox(0, '5',_WinAPI_ShellGetKnownFolderPath($FOLDERID_SendTo))
Code : Tout sélectionner
#include <WinAPIShellEx.au3>
MsgBox(0, '1',_WinAPI_ShellGetKnownFolderPath($FOLDERID_PublicLibraries))
MsgBox(0, '2',_WinAPI_ShellGetKnownFolderPath($FOLDERID_CommonStartup))
MsgBox(0, '3',_WinAPI_ShellGetKnownFolderPath($FOLDERID_CommonTemplates))
MsgBox(0, '4',_WinAPI_ShellGetKnownFolderPath($FOLDERID_Libraries))
MsgBox(0, '5',_WinAPI_ShellGetKnownFolderPath($FOLDERID_SendTo))
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
-
- Niveau 5
- Messages : 177
- Enregistré le : sam. 21 mars 2009 17:57
- Localisation : Bretagne
- Status : Hors ligne
Re: Convertir un dossier spécial en chemin d'accès
Alors, effectivement cela fonctionne avec vos valeurs, mais dès que je mets les miennes pour Documents par exemple, cela ne fonctionne pas et le résultat est vide.
Pourquoi ?
Pourquoi ?

- walkson
- Modérateur
- Messages : 1037
- Enregistré le : ven. 12 août 2011 19:49
- Localisation : Hurepoix
- Status : Hors ligne
Re: Convertir un dossier spécial en chemin d'accès
Aucune idée !
mais même avec la liste CLSID, on obtient d'étranges résultats
Cela ouvre la fenêtre image à la place de Fonts (Quand Windows ne trouve pas, il ouvre les images
)
Avec _WinAPI_ShellGetKnownFolderPath(), il faudra utiliser les constants dans APIShellExConstants.au3 ($FOLDERID_* et compagnie) mais des fois, il n'y a pas de retour, faudra tester aussi...
mais même avec la liste CLSID, on obtient d'étranges résultats
FileSelectFolder("Choose a folder.", "::{D20EA4E1-3957-11d2-A40B-0C5020524152}", 1);Fonts (Polices de caractère)
Cela ouvre la fenêtre image à la place de Fonts (Quand Windows ne trouve pas, il ouvre les images

Avec _WinAPI_ShellGetKnownFolderPath(), il faudra utiliser les constants dans APIShellExConstants.au3 ($FOLDERID_* et compagnie) mais des fois, il n'y a pas de retour, faudra tester aussi...
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
-
- Niveau 5
- Messages : 177
- Enregistré le : sam. 21 mars 2009 17:57
- Localisation : Bretagne
- Status : Hors ligne
Re: Convertir un dossier spécial en chemin d'accès
Bon, j'ai tenté le coup sur le forum anglais, mais c'est toujours aussi complexe.
https://www.autoitscript.com/forum/topi ... to-a-path/
Je vais laisser tomber, s'il faut un code complexe, juste pour ça, cela ne vaut pas trop le coup.
Surtout que sur Windows 10 les bibliothèques sont désactivées par défaut. Comme ça, personne n'ira cliquer dessus.
Merci en tout cas de vous êtes penché sur mon problème.
https://www.autoitscript.com/forum/topi ... to-a-path/
Je vais laisser tomber, s'il faut un code complexe, juste pour ça, cela ne vaut pas trop le coup.
Surtout que sur Windows 10 les bibliothèques sont désactivées par défaut. Comme ça, personne n'ira cliquer dessus.

Merci en tout cas de vous êtes penché sur mon problème.
- walkson
- Modérateur
- Messages : 1037
- Enregistré le : ven. 12 août 2011 19:49
- Localisation : Hurepoix
- Status : Hors ligne
Re: Convertir un dossier spécial en chemin d'accès
Bonjour,
Complexe ? non.
Essayez cela
Je découvre avec vous cette fonction que je trouve très intéressante car elle permet de joindre des dossiers peu habituels.
Le monde des "Winapi" est un monde obscure et mal documenté que je l'utilise de plus en plus car les résultats sont très appréciables.
Complexe ? non.
Essayez cela
Code : Tout sélectionner
#include <WinAPIShellEx.au3>
$libraries = _WinAPI_ShellGetKnownFolderPath($FOLDERID_Libraries)
MsgBox(0, '',$libraries)
FileSelectFolder("Choose a folder.", $libraries & "\Documents C.library-ms", 1) ; ou $FOLDERID_DocumentsLibrary avec _WinAPI_ShellGetKnownFolderPath()
FileSelectFolder("Choose a folder.", $libraries & "\Music.library-ms", 1) ; ou $FOLDERID_MusicLibrary avec _WinAPI_ShellGetKnownFolderPath() etc...
ShellExecute($libraries & "\Pictures.library-ms") ; ou $FOLDERID_PicturesLibrary
Sleep(1000)
ShellExecute($libraries & "\Videos.library-ms") ;ou $FOLDERID_VideosLibrary
Sleep(1000)
ShellExecute($libraries & "\Documents C.library-ms\Classeur1.xlsx") ; si "MesDocuments" possède Classeur1.xlsx
$libraries = _WinAPI_ShellGetKnownFolderPath($FOLDERID_PublicVideos)
ConsoleWrite($libraries & @CRLF) ;C:\Users\Public\Videos
ShellExecute($libraries & "\Sample Videos\Wildlife.wmv"); fonctionne sur Win7 RMQ: Faune.wmv est nommé en réalité Wildlife.wmv sur la french version
;ou
;$libraries = _WinAPI_ShellGetKnownFolderPath($FOLDERID_SampleVideos)
;ConsoleWrite($libraries & @CRLF) ;C:\Users\Public\Videos\Sample Videos
;ShellExecute($libraries & "\Wildlife.wmv")
#cs
ShellExecute("C:\Program Files\AutoIt3\Include\APIShellExConstants.au3")
;tous les chemins possibles
;ligne 604 à 705
#ce
Le monde des "Winapi" est un monde obscure et mal documenté que je l'utilise de plus en plus car les résultats sont très appréciables.
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)