9
votes

Obtenez un chemin de bureau commun dans .NET

Je dois stocker des fichiers dans le bureau commun sous Windows. L'application est une application très spéciale pour exactement un PC spécial (préparation du périphérique), il fallait donc être facile pour les utilisateurs non techniciens de trouver et de modifier le fichier de configuration. Maintenant, nous sommes passés à un domaine et, car différentes personnes (avec des comptes différents) doivent utiliser le logiciel, il doit être dans un lieu commun, vu par chaque utilisateur. Alors s'il vous plaît ne demandez pas pourquoi c'est sur le bureau;)

précédemment, je viens d'utiliser environnement.gefolderpath (environnement.specialfolder.desktop) . Il existe plusieurs dossiers communs dans le Specialfolder énumération, mais le bureau commun semble ne pas être là. Est-ce que je manque quelque chose ou dois-je p / invoquer shgetspecialfolderPath avec csidl_common_desktopdirectory ?


8 commentaires

Maintenant, il est sale. Malheureusement, il semble que j'ai par défaut aucun droit d'écrire sur le bureau commun, ce qui le rend compliqué. Des suggestions pour un meilleur emplacement? N'oubliez pas que l'utilisateur doit pouvoir trouver le fichier et tous les utilisateurs ont besoin d'un accès en lecture / écriture. L'application doit être déployée sur XCopy.


Bien que la question initiale reste valide (surtout que cela ne semble pas être nulle part), je pense que je vais devoir aller avec des documents communs (ou quel que soit le nom des systèmes anglais). C'est toujours un peu trouvé de l'utilisateur. J'espère juste que j'espère avoir un accès en écriture. N'hésitez pas à commenter si vous pensez que c'est une bonne / mauvaise idée.


Pourquoi ne les stockez-vous pas dans un stockage isolé de la machine?


@David Brunelle: Je vais regarder, merci.


Mince. Je savais que je devrais mettre cela dans une réponse à la place. J'aurais pu obtenir un vote ...: o


@David Brunelle: Bien que cela puisse résoudre mon problème sous-jacent, ce ne serait pas une réponse correcte à cette question :)


Wow, je ne peux pas croire qu'il n'y a pas une meilleure réponse à cela!


Notez que dans .NET 4.0, le Specialfolder Enumération contient CommoncesktopDirectory , qui est probablement ce que je demandais. Juste trop tard;)


5 Réponses :


2
votes

Je pense que vous devez utiliser le shgetspecialfolderPath API, car il n'y a pas de valeur ENUM pour "CommonesktopDirectory". Vous ne pouvez pas utiliser explicitement la valeur de csidl_common_desktopdirectory et le jeter en environnement.pecialfolder , car la méthode getfeuderpath vérifie que la valeur est définie dans la valeur. l'énum. Voici le code de la méthode getfolderpath (à partir du réflecteur): xxx

afin que vous puissiez facilement copier et adapter la pièce dont vous avez besoin ... < / p>


3 commentaires

Ok, je voulais juste être sûr. Maintenant que j'ai examiné les documents MSDN, vous devez noter qu'en Vista et plus tard, vous devez utiliser connu unfolderid au lieu de valeurs CLSID. Est-ce que cela s'applique également si mon application doit fonctionner sur XP?


Non, je pense que c'est pour Vista seulement


Je vais probablement aller avec un autre dossier (voir mes commentaires à la question), mais c'est la meilleure réponse à la question, alors je l'ai acceptée. Merci pour votre réponse rapide.



0
votes

Pour clarification - Par des postes de travail commun, vous voulez dire C: \ Documents et paramètres \ Tous les utilisateurs \ Desktop?

Si oui, il s'agit d'un piratage laid - xxx


2 commentaires

Oui, je veux dire ça. Mais c'est vraiment à laid.


Il va se casser dès que certains systèmes utilisent un autre nom pour le bureau: P



0
votes

Vous pouvez utiliser l'hôte de script Windows - Wshshell.Specialfolders

http://msdn.microsoft.com/ EN-US / Bibliothèque / 0A7B5XE (vs.85) .aspx


1 commentaires

Merci pour l'idée, mais je préférerais p / invoquer que d'introduire une telle dépendance :)



0
votes

Tout d'abord, ajoutez une référence à "Modèle d'objet hôte de script Windows". Vous le trouverez dans l'onglet COM de la boîte de dialogue "Ajouter des références".

using IWshRuntimeLibrary;

object commonUserDesktop = "AllUsersDesktop";
WshShell shell = new WshShellClass();
string commonPath = shell.SpecialFolders.Item(ref commonUserDesktop).ToString();


1 commentaires

Comme je l'ai écrit chez Bogdan_ch, je préfère utiliser WSH pour une telle tâche. P / invoke va bien avec moi.



0
votes

Autre moyen (oui, c'est aussi laid et ne fonctionnera probablement que sur Windows XP, pas sur Vista) est de lire une valeur du registre

HKEY_LOCAL_MACHINE \ LOGICIEL \ Microsoft \ Windows \ Courroversion \ Explorer \ Shell Dossiers, Bureau commun


1 commentaires

Ce n'est pas seulement laid, mais un cauchemar de compatibilité. Si je me souviens bien, il n'était même que dans une version du CTP de Windows, mais que des applications se sont livrées à ce sujet, elle doit être sous Windows depuis des décennies.