Problème exception : UnauthorizedAccessException - Treeview listage contenu disq

Dhazel Messages postés 10 Date d'inscription dimanche 21 mars 2010 Statut Membre Dernière intervention 15 janvier 2012 - 14 janv. 2012 à 19:46
NHenry Messages postés 15151 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 septembre 2024 - 16 janv. 2012 à 20:56
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

NHenry Messages postés 15151 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 septembre 2024 159
14 janv. 2012 à 20:39
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
---
0
Dhazel Messages postés 10 Date d'inscription dimanche 21 mars 2010 Statut Membre Dernière intervention 15 janvier 2012
15 janv. 2012 à 02:28
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)
        {

        }
    }
}
0
NHenry Messages postés 15151 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 septembre 2024 159
15 janv. 2012 à 02:52
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
---
0
Dhazel Messages postés 10 Date d'inscription dimanche 21 mars 2010 Statut Membre Dernière intervention 15 janvier 2012
15 janv. 2012 à 17:12
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 :
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
NHenry Messages postés 15151 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 septembre 2024 159
15 janv. 2012 à 17:42
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
---
0
Dhazel Messages postés 10 Date d'inscription dimanche 21 mars 2010 Statut Membre Dernière intervention 15 janvier 2012
15 janv. 2012 à 18:32
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.
0
Dhazel Messages postés 10 Date d'inscription dimanche 21 mars 2010 Statut Membre Dernière intervention 15 janvier 2012
15 janv. 2012 à 18:39
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é.
0
NHenry Messages postés 15151 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 septembre 2024 159
15 janv. 2012 à 18:49
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
---
0
Dhazel Messages postés 10 Date d'inscription dimanche 21 mars 2010 Statut Membre Dernière intervention 15 janvier 2012
15 janv. 2012 à 22:12
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.
0
Dhazel Messages postés 10 Date d'inscription dimanche 21 mars 2010 Statut Membre Dernière intervention 15 janvier 2012
15 janv. 2012 à 22:17
Ah aussi petite précision l'UAC est désactivé sur mon ordinateur.
0
NHenry Messages postés 15151 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 septembre 2024 159
16 janv. 2012 à 20:56
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
---
0
Rejoignez-nous