Obtenir un chemin de bureau commun dans .NET

J’ai besoin de stocker des fichiers sur le bureau commun sous Windows. L’application est une application très spéciale pour exactement un PC spécial (préparation de périphérique), il a donc dû être facile pour les utilisateurs non-techniciens de trouver et de modifier le fichier de configuration. Maintenant, nous sums passés à un domaine, et parce que différentes personnes (avec des comptes différents) devraient utiliser le logiciel, il doit être dans un lieu commun, vu par chaque utilisateur. Alors s’il vous plaît ne demandez pas pourquoi il est sur le bureau;)

Auparavant, je viens d’utiliser Environment.GetFolderPath(Environment.SpecialFolder.Desktop) . Il existe plusieurs dossiers communs dans l’énumération SpecialFolder , mais le bureau commun semble ne pas être présent. Est-ce que je manque quelque chose ou dois-je invoquer SHGetSpecialFolderPath avec CSIDL_COMMON_DESKTOPDIRECTORY ?

Je pense que vous devez utiliser l’API SHGetSpecialFolderPath , car il n’y a pas de valeur enum pour “CommonDesktopDirectory”. Vous ne pouvez pas explicitement utiliser la valeur de CSIDL_COMMON_DESKTOPDIRECTORY et la CSIDL_COMMON_DESKTOPDIRECTORY en Environment.SpecialFolder , car la méthode GetFolderPath vérifie que la valeur est définie dans l’énumération. Voici le code de la méthode GetFolderPath (de Reflector):

 public static ssortingng GetFolderPath(SpecialFolder folder) { if (!Enum.IsDefined(typeof(SpecialFolder), folder)) { throw new ArgumentException(ssortingng.Format(CultureInfo.CurrentCulture, GetResourceSsortingng("Arg_EnumIllegalVal"), new object[] { (int) folder })); } SsortingngBuilder lpszPath = new SsortingngBuilder(260); Win32Native.SHGetFolderPath(IntPtr.Zero, (int) folder, IntPtr.Zero, 0, lpszPath); ssortingng path = lpszPath.ToSsortingng(); new FileIOPermission(FileIOPermissionAccess.PathDiscovery, path).Demand(); return path; } 

Ainsi, vous pouvez facilement copier et adapter la pièce dont vous avez besoin …

Pour plus de précision – Par bureau commun, voulez-vous dire C: \ Documents and Settings \ Tous les utilisateurs \ Desktop?

Si oui, c’est un hack moche –

 Dim c As Ssortingng = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) Dim comDesktop As Ssortingng = c.Subssortingng(0, c.LastIndexOf("\")) + "\Desktop" 

Vous pouvez utiliser Windows Script Host – WshShell.SpecialFolders

http://msdn.microsoft.com/en-us/library/0ea7b5xe(VS.85).aspx

Tout d’abord, ajoutez une référence à “Modèle d’object hôte de script Windows”. Vous le trouverez dans l’onglet COM de la boîte de dialog “Ajouter des références”.

 using IWshRuntimeLibrary; object commonUserDesktop = "AllUsersDesktop"; WshShell shell = new WshShellClass(); ssortingng commonPath = shell.SpecialFolders.Item(ref commonUserDesktop).ToSsortingng(); 

Une autre manière (oui c’est aussi moche et fonctionnera probablement uniquement sur Windows XP, pas sur Vista) est de lire une valeur du registre

HKEY_LOCAL_MACHINE \ LOGICIELS \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Dossiers Shell, Bureau commun