Problème exception : UnauthorizedAccessException - Treeview listage contenu disq

Signaler
Messages postés
10
Date d'inscription
dimanche 21 mars 2010
Statut
Membre
Dernière intervention
15 janvier 2012
-
Messages postés
14681
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
26 juillet 2020
-
Bonsoir,

Je travaille actuellement sur le développement d'un logiciel de gestion de fichier.
Jusqu'à présent j'ai réussis à avoir un affichage du contenu de mon disque dur dans mes 2 TreeViews.

Puis je me suis aperçu que je n'ai pas la totalité des dossiers affichés dans mes treeviews et que l'exception UnauthorizedAccessException en est la cause.

Je ne sais pas si mon soucis est de l'ordre du codage ou bien un problème de droits d'accès.

Merci d'avance pour vos réponses.

Voici le résultat écran :

http://imageshack.us/photo/my-images/6/treeview1.png/


Et voici mon code (Le méthode en commentaire est une variante pour l'affichage dans les treeview mais sans try/catch) :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;

namespace Project
{
    public partial class Gestionnaire : Form
    {
        string substringDirectory;
        public Gestionnaire()
        {
            InitializeComponent();
            treeView1.Nodes.Clear();
            treeView2.Nodes.Clear();
        
            String path = "C:\";

            treeView1.Nodes.Add(path);
            treeView2.Nodes.Add(path);
            PopulateTreeView(path, treeView1.Nodes[0]);
            PopulateTreeView(path, treeView2.Nodes[0]);
        }
        /*public void PopulateTreeView(string dir, TreeNode node)
        {
            // get the information of the directory
            DirectoryInfo directory = new DirectoryInfo(dir);
            // loop through each subdirectory
            foreach (DirectoryInfo d in directory.GetDirectories())
            {
                // create a new node
                TreeNode t = new TreeNode(d.Name);
                // populate the new node recursively
                PopulateTreeView(d.FullName, t);
                node.Nodes.Add(t); // add the node to the "master" node
            }
            // lastly, loop through each file in the directory, and add these as nodes
            foreach (FileInfo f in directory.GetFiles())
            {
                // create a new node
                TreeNode t = new TreeNode(f.Name);
                // add it to the "master"
                node.Nodes.Add(t);
            }
        }*/
        public void PopulateTreeView(string directoryValue, TreeNode parentNode)
        {
            string[] directoryArray = Directory.GetDirectories(directoryValue);

            try
            {
                if (directoryArray.Length != 0)
                {
                    foreach (string directory in directoryArray)
                    {
                        substringDirectory = directory.Substring(
                        directory.LastIndexOf('\\') + 1,
                        directory.Length - directory.LastIndexOf('\\') - 1);

                        TreeNode myNode = new TreeNode(substringDirectory);

                        parentNode.Nodes.Add(myNode);

                        PopulateTreeView(directory, myNode);
                    }
                }
            }
            catch (UnauthorizedAccessException)
            {
                parentNode.Nodes.Add("Access denied");
            } // end catch
        }

        private void Gestionnaire_Load(object sender, System.EventArgs e)
        {

        }
    }
}

11 réponses

Messages postés
14681
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
26 juillet 2020
144
Bonjour,

Ajoutes aussi un try/catch dans :
foreach (string directory in directoryArray)

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Messages postés
10
Date d'inscription
dimanche 21 mars 2010
Statut
Membre
Dernière intervention
15 janvier 2012

Rebonsoir,
NHenry j'ai donc rajouté le try/catch dans le foreach comme conseillé et cette fois ci la solution ne réponds plus et je dois la tuer via le gestionnaire des tâches.

Après quelques recherches sur mon problème de répertoire j'ai trouvé que cela pouvait venir des droits sur certains dossiers de mon disque dur sur lesquels Visual ou mon logiciel n'a pas d'accès pour les lister.

Merci d'avance pour vos réponses.

Ci-joint le nouveau code avec le try/catch en plus :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;

namespace Project
{
    public partial class Gestionnaire : Form
    {
        string substringDirectory;
        public Gestionnaire()
        {
            InitializeComponent();
            treeView1.Nodes.Clear();
            treeView2.Nodes.Clear();
        
            String path = "C:\";

            treeView1.Nodes.Add(path);
            treeView2.Nodes.Add(path);
            PopulateTreeView(path, treeView1.Nodes[0]);
            PopulateTreeView(path, treeView2.Nodes[0]);
        }
        /*public void PopulateTreeView(string dir, TreeNode node)
        {
            // get the information of the directory
            DirectoryInfo directory = new DirectoryInfo(dir);
            // loop through each subdirectory
            foreach (DirectoryInfo d in directory.GetDirectories())
            {
                // create a new node
                TreeNode t = new TreeNode(d.Name);
                // populate the new node recursively
                PopulateTreeView(d.FullName, t);
                node.Nodes.Add(t); // add the node to the "master" node
            }
            // lastly, loop through each file in the directory, and add these as nodes
            foreach (FileInfo f in directory.GetFiles())
            {
                // create a new node
                TreeNode t = new TreeNode(f.Name);
                // add it to the "master"
                node.Nodes.Add(t);
            }
        }*/
        public void PopulateTreeView(string directoryValue, TreeNode parentNode)
        {
            string[] directoryArray = Directory.GetDirectories(directoryValue);

            try
            {
                if (directoryArray.Length != 0)
                {
                     foreach (string directory in directoryArray)
                        {
                            try
                            {
                                substringDirectory = directory.Substring(
                                directory.LastIndexOf('\\') + 1,
                                directory.Length - directory.LastIndexOf('\\') - 1);

                                TreeNode myNode = new TreeNode(substringDirectory);

                                parentNode.Nodes.Add(myNode);

                                PopulateTreeView(directory, myNode);
                            }
                            catch (UnauthorizedAccessException)
                            {
                                parentNode.Nodes.Add("Access denied");
                            } // end catch
                        }
                  }
            }
            catch (UnauthorizedAccessException)
            {
                parentNode.Nodes.Add("Access denied");
            } // end catch
        }

        private void Gestionnaire_Load(object sender, System.EventArgs e)
        {

        }
    }
}
Messages postés
14681
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
26 juillet 2020
144
Bonjour,

As-tu regardé en pas à pas, ce qu'il se passait ?
Je pense que la solution n'est pas loin.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Messages postés
10
Date d'inscription
dimanche 21 mars 2010
Statut
Membre
Dernière intervention
15 janvier 2012

Bonjour,

J'ai donc fais comme conseillé avec une exécution pas à pas et voici le résultat, lorsque la première exception UnauthorizedAccessException est "catch".

Ci-joint la capture d'écran :
Messages postés
14681
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
26 juillet 2020
144
Bonjour,

Ce que je voulais te faire comprendre, c'est regarder pourquoi le listage s'arrête prématurément, comment réagit ton programme en cas d'exception ?

Tu ne traite qu'une exception, mais si une autre se produit, tu ne traites rien.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Messages postés
10
Date d'inscription
dimanche 21 mars 2010
Statut
Membre
Dernière intervention
15 janvier 2012

Bonjour,

Toujours sur tes conseils j'ai rajouté la gestion d'autres exceptions et par la suite réussis à avoir le listage complet de mon disque dur C: (très long traitement :) )

Voici le résultat :


Ainsi que le nouveau code :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;
using System.Security.Permissions;
[assembly: PermissionSetAttribute(SecurityAction.RequestMinimum, Name = "FullTrust")]

namespace MyFileManager
{
    public partial class Gestionnaire : Form
    {
        string substringDirectory;
        public Gestionnaire()
        {
            InitializeComponent();
            treeView1.Nodes.Clear();
            treeView2.Nodes.Clear();
        
            String path = "C:\";

            treeView1.Nodes.Add(path);
            treeView2.Nodes.Add(path);
            PopulateTreeView(path, treeView1.Nodes[0]);
            PopulateTreeView(path, treeView2.Nodes[0]);
        }
        /*public void PopulateTreeView(string dir, TreeNode node)
        {
            // get the information of the directory
            DirectoryInfo directory = new DirectoryInfo(dir);
            // loop through each subdirectory
            foreach (DirectoryInfo d in directory.GetDirectories())
            {
                // create a new node
                TreeNode t = new TreeNode(d.Name);
                // populate the new node recursively
                PopulateTreeView(d.FullName, t);
                node.Nodes.Add(t); // add the node to the "master" node
            }
            // lastly, loop through each file in the directory, and add these as nodes
            foreach (FileInfo f in directory.GetFiles())
            {
                // create a new node
                TreeNode t = new TreeNode(f.Name);
                // add it to the "master"
                node.Nodes.Add(t);
            }
        }*/
       public void PopulateTreeView(string directoryValue, TreeNode parentNode)
        {
            string[] directoryArray = Directory.GetDirectories(directoryValue);

            try
            {
                if (directoryArray.Length != 0)
                {
                     foreach (string directory in directoryArray)
                        {
                            try
                            {
                                substringDirectory = directory.Substring(
                                directory.LastIndexOf('\\') + 1,
                                directory.Length - directory.LastIndexOf('\\') - 1);

                                TreeNode myNode = new TreeNode(substringDirectory);

                                parentNode.Nodes.Add(myNode);

                                PopulateTreeView(directory, myNode);
                            }
                            catch (UnauthorizedAccessException e)
                            {

                                Console.WriteLine(e.Message);
                                continue;
                            }

                            catch (System.IO.DirectoryNotFoundException e)
                            {
                                Console.WriteLine(e.Message);
                                continue;
                            }
                        }
                  }
            }
            catch (UnauthorizedAccessException)
            {
                parentNode.Nodes.Add("Access denied");
            } // end catch
        }

        private void Gestionnaire_Load(object sender, System.EventArgs e)
        {

        }
    }
}


En conclusion la gestion des exceptions permet de "passer" l'exception capturée et de continuer le listage des dossiers et sous dossiers.

Il me reste a trouver comment avoir accès à tout les dossiers et rajouter le listage et affichage des fichiers contenu dans les dossiers.
Aurais tu des suggestions?

Merci d'avance pour le temps passé sur mon cas.

Cdt,
Dhazel.
Messages postés
10
Date d'inscription
dimanche 21 mars 2010
Statut
Membre
Dernière intervention
15 janvier 2012

Pardon j'avais oublié les messages console en voici un extrait :

Une exception de première chance de type 'System.UnauthorizedAccessException' s'est produite dans mscorlib.dll
Une exception de première chance de type 'System.UnauthorizedAccessException' s'est produite dans mscorlib.dll
Une exception de première chance de type 'System.UnauthorizedAccessException' s'est produite dans mscorlib.dll
Une exception de première chance de type 'System.UnauthorizedAccessException' s'est produite dans mscorlib.dll
Une exception de première chance de type 'System.UnauthorizedAccessException' s'est produite dans mscorlib.dll
Une exception de première chance de type 'System.UnauthorizedAccessException' s'est produite dans mscorlib.dll
Une exception de première chance de type 'System.UnauthorizedAccessException' s'est produite dans mscorlib.dll
Une exception de première chance de type 'System.UnauthorizedAccessException' s'est produite dans mscorlib.dll
L'accès au chemin d'accès 'C:\Users\All Users\Modèles\' est refusé.
L'accès au chemin d'accès 'C:\Users\All Users\Start Menu\' est refusé.
L'accès au chemin d'accès 'C:\Users\All Users\Templates\' est refusé.
L'accès au chemin d'accès 'C:\Users\Default\AppData\Local\Application Data\' est refusé.
L'accès au chemin d'accès 'C:\Users\Default\AppData\Local\Historique\' est refusé.
L'accès au chemin d'accès 'C:\Users\Default\AppData\Local\History\' est refusé.
L'accès au chemin d'accès 'C:\Users\Default\AppData\Local\Temporary Internet Files\' est refusé.
Messages postés
14681
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
26 juillet 2020
144
Bonjour,

Il faudrait lancer ton programme en tant qu'administrateur, c'est la seule solution.

Voir entre autre :
http://stackoverflow.com/questions/2818179/how-to-force-c-sharp-app-to-run-as-administrator-on-windows-7

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Messages postés
10
Date d'inscription
dimanche 21 mars 2010
Statut
Membre
Dernière intervention
15 janvier 2012

Merci pour le lien j'ai donc changé la valeur de <requestedExecutionLevel> comme ceci :

ancienne valeur :
<requestedExecutionLevel  level="asInvoker" uiAccess="false" />


nouvelle valeur :
<requestedExecutionLevel  level="highestAvailable" uiAccess="false" />


Une erreur survient et je n'arrive pas à la résoudre, j'ai essayé avec les 2 valeurs possibles level="requireAdministrator" et level="highestAvailable".

Ci-joint le screenshot d'après génération de la solution :



Merci encore pour votre aide.
Messages postés
10
Date d'inscription
dimanche 21 mars 2010
Statut
Membre
Dernière intervention
15 janvier 2012

Ah aussi petite précision l'UAC est désactivé sur mon ordinateur.
Messages postés
14681
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
26 juillet 2020
144
Bonjour,

N'ayant pas Win7 ou WinVista chez moi, je ne peux pas vraiment vérifier.
Je pense que ça reste ça, mais je ne puis en dire plus, désolé.
http://www.codeease.com/force-windows-form-application-to-run-as-administrator-on-windows-7.html

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---