2009-08-11 9 views
8

J'ai besoin de 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 de périphérique), donc il devait être facile pour les utilisateurs non-techie de trouver et de modifier le fichier de configuration. Maintenant, nous sommes 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 c'est sur le bureau;)Récupère le chemin d'accès au bureau commun dans .NET

Auparavant, je viens d'utiliser Environment.GetFolderPath(Environment.SpecialFolder.Desktop). Il existe plusieurs des dossiers communs dans l'énumération SpecialFolder, mais le bureau commun semble ne pas être là. Ai-je manqué quelque chose, ou dois-je p/invoquer SHGetSpecialFolderPath avec CSIDL_COMMON_DESKTOPDIRECTORY?

+0

Maintenant, il est sale. Malheureusement, il semble que je n'ai pas par défaut le droit d'écrire sur le bureau commun, ce qui complique la tâche. Des suggestions pour un meilleur emplacement? Rappelez-vous que l'utilisateur devrait être capable de trouver le fichier, et tous les utilisateurs ont besoin d'un accès en lecture/écriture. L'application doit être déployée par XCOPY. – OregonGhost

+0

Alors que la question d'origine reste valide (d'autant plus qu'elle ne semble nulle part sur SO), je pense que je vais devoir aller avec des documents communs (ou quel que soit le nom sur les systèmes anglais). C'est toujours un peu trouvable par l'utilisateur. Maintenant, 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. – OregonGhost

+0

Pourquoi ne les stockez-vous pas dans un stockage isolé d'une machine? –

Répondre

2

Je pense que vous devez utiliser l'API SHGetSpecialFolderPath, car il n'y a pas de valeur d'énumération pour "CommonDesktopDirectory". Vous ne pouvez pas utiliser explicitement la valeur de CSIDL_COMMON_DESKTOPDIRECTORY et la convertir 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 (du réflecteur):

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

Vous pouvez facilement copier et adapter la partie que vous avez besoin ...

+0

OK, je voulais juste être sûr.Maintenant que j'ai regardé les documents MSDN, il y a une note que dans Vista et plus tard, vous devriez utiliser KNOWNFOLDERID au lieu des valeurs CLSID. Cela s'applique-t-il également si mon application doit fonctionner sous XP? – OregonGhost

+0

Non, je pense que c'est pour Vista seulement –

+0

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

0

Pour plus de précisions - Par bureau commun voulez-vous dire C: \ Documents et paramètres \ Tous les utilisateurs \ Desktop?

Si oui, c'est une bidouille horrible -

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

Oui, je le pense. Mais c'est vraiment moche. – OregonGhost

+0

Il va se casser dès qu'un système utilise un autre nom pour Desktop: p –

0

En premier lieu, ajouter une référence à « Windows Script Host Objet Modèle". 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(); 
+0

Comme je l'ai écrit à la réponse de Bogdan_Ch, je préfère n'utilisez pas WSH pour une telle tâche. P/Invoke va bien avec moi. – OregonGhost

0

Une autre façon (oui, il est aussi laid et ne fonctionnera probablement sous Windows XP, pas sur Vista) est de lire une valeur de Registre

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Shell Folders, Common Desktop

+0

Ce n'est pas seulement laid, mais un cauchemar de compatibilité. Si je me souviens bien, c'était seulement dans une version CTP de Windows, mais puisque les applications comptaient sur elle, ça doit être dans Windows depuis des décennies. – OregonGhost

Questions connexes