2010-06-02 3 views
4

Vous essayez de supprimer une arborescence de sous-clé: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.hdr. .hdr sous-clé a une sous-clé, pas de valeurs. Donc j'utilise ce code:Registre dans .NET: DeleteSubKeyTree dit que la sous-clé n'existe pas, mais bon, c'est le cas!

RegistryKey FileExts = Registry.CurrentUser.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts"); 
RegistryKey faulty = FileExts.OpenSubKey(".hdr"); 
Debug.Assert (faulty != null && faulty.SubKeyCount != 0); 
faulty.Close(); 
FileExts.DeleteSubKeyTree(".hdr"); 

Et je reçois le ArgumentException avec le message « Impossible de supprimer un arbre de sous-clé, car la sous-clé n'existe pas. »

WTF? J'ai vérifié et affirmé qu'il existait?

mise à jour du statut

Recherche avec Process Monitor, la sous-clé de ".hdr" obtient une erreur ACCESS DENIED lors de l'exécution du code. J'ai vérifié les autorisations, mais ils ont l'air bien?

+1

Utilisez-vous un système d'exploitation 64 bits? – Chris

+0

Oui, Windows 7 pro 64bits – CharlesB

+1

Chris peut être sur quelque chose: le registre est virtualisé, donc vous regardez la mauvaise version. –

Répondre

5

trouvé une solution, ce qui soulève une autre question ... autre

Après avoir signalé l'erreur ACCESS DENIED avec Process Monitor, je viens d'essayer de supprimer des sous-clés individuellement:

RegistryKey hdr = FileExts.OpenSubKey(".hdr", true); 
foreach (String key in hdr.GetSubKeyNames()) 
    hdr.DeleteSubKey(key); 
hdr.Close(); 
FileExts.DeleteSubKeyTree(".hdr"); 

Il a bien fonctionné, donc ce n'est pas un problème d'autorisation!

Pour une raison que je ne comprends pas, DeleteSubKeyTree avait besoin d'un arbre vide pour fonctionner.

Une explication, quelqu'un?

+1

Merci, ça me rendait fou en me disant que la sous-clé n'existait pas quand c'était le cas. – midspace

+1

Je suis capable de supprimer récursivement une clé d'extension (par exemple, '.hdr') de la clé' FileExts' via 'DeleteSubKeyTree' en utilisant Visual Studio 2013 et .NET Framework 4.5. Donc, peut-être que le problème que vous avez rencontré a été résolu. – DavidRR

0

J'ai eu le même problème mais une résolution différente. L'appel DeleteSubKeyTree a déclenché ArgumentException en indiquant que la clé n'existait pas. C'est certainement le cas! Je suis itératif sur les noms de clés existants et je suis capable de créer un RegistryKey.

using (RegistryKey regClasses = Registry.ClassesRoot.OpenSubKey("CLSID", true)) 
{ 
    foreach (var class_guid in regClasses.GetSubKeyNames()) 
    { 
     bool should_remove = false; 
     using (RegistryKey productKey = regClasses.OpenSubKey(class_guid)) 
      should_remove = <some code here> 
     if (should_remove) 
      regClasses.DeleteSubKeyTree(class_guid); 
    } 
} 

Puis j'ai réalisé que j'étais en train de déboguer en mode utilisateur. Lorsque j'ai couru en tant qu'administrateur, cela a bien fonctionné. Étrange que le premier OpenSubKey fonctionne en mode utilisateur, mais quand j'ouvre les sous-clés ci-dessous j'ai correctement reçu l'accès refusé en mode utilisateur.