Convertir un dossier spécial en chemin d'accès

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
eric
Niveau 5
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

#1

Message par eric »

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
Avatar du membre
DimVar
Niveau 10
Niveau 10
Messages : 867
Enregistré le : ven. 30 mai 2008 15:08
Status : Hors ligne

Re: Convertir un dossier spécial en chemin d'accès

#2

Message par DimVar »

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.
N'évoquons pas la pierre, les jeunes risqueraient d'en poire !
eric
Niveau 5
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

#3

Message par eric »

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
Avatar du membre
DimVar
Niveau 10
Niveau 10
Messages : 867
Enregistré le : ven. 30 mai 2008 15:08
Status : Hors ligne

Re: Convertir un dossier spécial en chemin d'accès

#4

Message par DimVar »

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/
N'évoquons pas la pierre, les jeunes risqueraient d'en poire !
eric
Niveau 5
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

#5

Message par eric »

Ah ouais, visiblement cela semble plus compliqué que ce que j'avais imaginé.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: Convertir un dossier spécial en chemin d'accès

#6

Message par Tlem »

Bonsoir.

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é".
eric
Niveau 5
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

#7

Message par eric »

Bonjour,

Merci Thierry,

Je vais tester ce code.

Cordialement

Eric
eric
Niveau 5
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

#8

Message par eric »

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

Code : Tout sélectionner

#include <WinAPIShellEx.au3>
$dossier = _WinAPI_ShellGetSpecialFolderPath("::{21EC2020-3AEA-1069-A2DD-08002b30309d}") ;(normalement Control Panel)
MsgBox(4096,"",$dossier)
Me retourne sur mon PC : C:\Users\user\Desktop

Code : Tout sélectionner

#include <WinAPIShellEx.au3>
$dossier = _WinAPI_ShellGetSpecialFolderPath("::{7be9d83c-a729-4d97-b5a7-1b7313c39e0a}") ;(normalement Programs Folder)
MsgBox(4096,"",$dossier)
Me retourne aussi sur mon PC : C:\Users\user\Desktop

C'est bizarre !
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: Convertir un dossier spécial en chemin d'accès

#9

Message par Tlem »

Bonsoir.
Effectivement, il semble que je soit aller un peut vite en besogne ... :oops:

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 :
Global Const $CSIDL_APPDATA = 0x001A
Global Const $CSIDL_COMMON_DESKTOPDIRECTORY = 0x0019
Global Const $CSIDL_RECENT = 0x0008
Global Const $CSIDL_SENDTO = 0x0009


Je n'ai malheureusement pas trouvé comment faire le lien entre le CLSID (GUID) et le CSIDL.

Désolé pour la fausse joie. :oops:
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é".
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
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

#10

Message par walkson »

Bonjours
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)
eric
Niveau 5
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

#11

Message par eric »

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.
eric
Niveau 5
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

#12

Message par eric »

A tout hasard, je vais essayer de poser la question sur le forum anglais.
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
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

#13

Message par walkson »

essayez

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))
ou

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)
eric
Niveau 5
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

#14

Message par eric »

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 ? :?
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
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

#15

Message par walkson »

Aucune idée !
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 :P )
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)
eric
Niveau 5
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

#16

Message par eric »

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. :D

Merci en tout cas de vous êtes penché sur mon problème.
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
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

#17

Message par walkson »

Bonjour,
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
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.
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Répondre