Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Candidat au Club
    L'accès au chemin d'accès 'C:\Documents and Settings' est refusé.
    Bonjour à tous,

    Dans le cadre d'un projet, je souhaite lancer une recherche de fichier d'une extension (.txt par exemple) sur l'ensemble du disque C:\
    Comme beaucoup d'autres avant moi, je rencontre une difficulté liée au répertoire "Documents and Settings".
    J'ai fouillé Internet (ce forum et d'autres, Youtube ...) sans trouver de solution à ma problématique.

    Dans les faits, je clique sur un bouton, la recherche se lance mais le programme s'arrête lorsqu'il arrive à C:\Documents and Settings.

    Je voudrais que le programme puisse continuer la recherche après cette erreur ou carrément, en ignorant ce satané répertoire.

    J'ai essayé avec un Try / Catch mais bon, ça m'affiche juste l'erreur dans un MessageBox par exemple et le programme stoppe la recherche.
    J'ai pensé à une boucle While ou for ou encore foreach. De ce que j'ai pu comprendre de ces fonctions, elles ne me permettraient pas de résoudre ma problématique car il faut déterminer une fin de boucle et, de ce que j'ai pu voir, c'est un nombre qui peut être déterminé alors que moi, c'est la fin de la recherche... je ne sais pas si c'est clair ^^

    J'ai également pu voir comme solution : exécuter le programme en tant qu'admionistrateur. J'ai essayé et ça ne fonctionne pas.

    Est-ce que l'un de vous a une solution/piste à m'apporter ?

    Je vous remercie par avance.

    Nivek

  2. #2
    Nouveau membre du Club
    Tu as quel système d'exploitation parce que ça fait longtemps que j'ai plus vu ce dossier je ne l'ai pas personnellement sous Windows 10 donc je pense que ça doit être sous Windows 7

  3. #3
    Candidat au Club
    Hello iR3SH,

    Il est vrai que j'ai oublié d'apporter les précisions de base quant aux versions utilisées.
    Je bosse sur Windows 10 Pro et Visual Studio 2019.

    De ce que j'ai pu trouver sur le net, le dossier Documents and settings est un "point de jonction". J'ignore ce que cela signifie. Depuis Win 7 me semble-t-il, ce dossier est là, dans C:\Users mais n'est visible par personne. Il ne s'affiche pas en activation l'affichage des fichiers et dossiers cachés, non accessible en indiquant le chemin dans la barre d'adresse de l'explorateur Windows... bref, un poison ce dossier

  4. #4
    Membre émérite
    Tu ne nous montre même pas comment tu recherches.
    C'est difficile de corriger quelque chose qu'on ne vois pas.

    ---------------------

    Informations complémentaires qui sont valables quel que soit ton code.
    Il est inutile de chercher des fichiers dans le répertoire 'C:\Users' sous Windows 10 car le système l'interdit.

    Néanmoins écrire ceci ne poste pas de problème, c'est juste que cela ne renvoie rien.
    String[] files = Directory.GetFiles(@"C:\Users\", "*.txt", SearchOption.TopDirectoryOnly);

    L'utilisation de SearchOption.AllDirectories te renverra également une erreur car il existe de nombreux répertoire que le système interdira de lire.

    Il n'y a donc pas de moyens vite fait de faire une recherche sur tout le disque C.
    Mais rien ne t'empêche de lister les fichier puis les répertoire de C:
    Code C# :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    String[] files = Directory.GetFiles(@"C:\", "*.txt", SearchOption.TopDirectoryOnly);
    Directory.GetDirectories(@"C:\");


    Ni ceux de C:\Users :
    Code C# :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    String[] files = Directory.GetFiles(@"C:\Users\", "*.txt", SearchOption.TopDirectoryOnly);
    Directory.GetDirectories(@"C:\Users\");



    Donc avec un procédure récursive et une exception interceptée au bon endroit, tu devrais pouvoir parcourir ton disque petit à petit.

  5. #5
    Candidat au Club
    Hello @popo

    Merci pour ta réponse.

    Voici mon code (recherche de dossiers et affichage du résultat dans une liste) :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    String[] dossiers= Directory.GetDirectories(@"C:\ , "*.txt", SearchOption.AllDirectories);
     
    try
                    {
                        foreach (String MesDossiers in dossiers)
                        checkedListBoxFichiers.Items.Add(MesDossiers);
                    }
                    catch (Exception)
                    {
                        MessageBox.Show("Erreur c:");
                    }


    Ce code me renvoie l'erreur suivante :
    System.UnauthorizedAccessException*: 'L'accès au chemin d'accès 'C:\Documents and Settings' est refusé.'
    A la suite de ta réponse, j'ai essayé avec SearchOption.TopDirectoryOnly.
    La recherche ne se lance pas.

    Mon soucis, je pense, ce situe dans ta dernière information :
    Donc avec un procédure récursive et une exception interceptée au bon endroit, tu devrais pouvoir parcourir ton disque petit à petit.
    Je ne sais pas comment faire. Comment choisir à quel moment (endroit) l'exception va être interceptée ? Tout ce que je sais à ce sujet est dans le code que j'ai donné.

  6. #6
    Expert confirmé
    Citation Envoyé par Nivek_33 Voir le message
    Hello iR3SH,

    Il est vrai que j'ai oublié d'apporter les précisions de base quant aux versions utilisées.
    Je bosse sur Windows 10 Pro et Visual Studio 2019.

    De ce que j'ai pu trouver sur le net, le dossier Documents and settings est un "point de jonction". J'ignore ce que cela signifie. Depuis Win 7 me semble-t-il, ce dossier est là, dans C:\Users mais n'est visible par personne. Il ne s'affiche pas en activation l'affichage des fichiers et dossiers cachés, non accessible en indiquant le chemin dans la barre d'adresse de l'explorateur Windows... bref, un poison ce dossier

    Dans Explorateurs de Fichiers(pan. de conf. windows 10) ->affichage -> décocher masquer les fichiers et dossiers cachés du système.
    Tu verras tout y compris Documents and Settings.
    En prime UNO tu peux cliquer sur l'icone et tu verras son contenu.
    Et en prime SECUNDO tu verras en haut de l'Explorateur le chemin réel ver lequel renvoie ce raccourci dit "point de jonction".

    Bon code...

  7. #7
    Candidat au Club
    Citation Envoyé par MABROUKI Voir le message
    Dans Explorateurs de Fichiers(pan. de conf. windows 10) ->affichage -> décocher masquer les fichiers et dossiers cachés du système.
    Tu verras tout y compris Documents and Settings.
    En prime UNO tu peux cliquer sur l'icone et tu verras son contenu.
    Et en prime SECUNDO tu verras en haut de l'Explorateur le chemin réel ver lequel renvoie ce raccourci dit "point de jonction".

    Bon code...

    Bonjour MABROUKI,
    Merci pour la manip mais je sais comment afficher les fichiers cachés sur un ordi. Je ne sais pas comment tu fais pour voir "Documents and Settings" sur un Windows 10 par contre... y a que toi qui l'as non ?
    Autre point, je ne vois pas comment afficher les dossiers cachés va résoudre mon problème de droits d'accès.
    Peut-être as-tu plus de précisions à m'apporter ?

  8. #8
    Membre émérite
    Directory.GetDirectories sert à rechercher des répertoires et pas des fichiers.
    Là tu essaie de trouver des DOSSIERS avec une extension.

    Comme je l'ai précisé l'unique moyen de faire ce que tu veux c'est de parcourir les répertoires de manière récursive.

    Ceci est une ébauche écrite à la va vite.
    Le but est que tu comprenne le principe et que tu l'améliores.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void SearchFiles(string currentDirectory, int currentDepth, int maxDepth, List<string> files)
    {
        files.AddRange(Directory.GetFiles(currentDirectory, "*.txt", SearchOption.TopDirectoryOnly));
     
        int depth = currentDepth + 1;
        if (depth <= maxDepth)
        {
            string[] directories = Directory.GetDirectories(currentDirectory);
            foreach (string directory in directories)
            {
                SearchFiles(directory, depth, maxDepth, files);
            }
        }
    }

  9. #9
    Candidat au Club
    Citation Envoyé par popo Voir le message
    Directory.GetDirectories sert à rechercher des répertoires et pas des fichiers.
    Là tu essaie de trouver des DOSSIERS avec une extension.
    Oups, erreur de recopie. Dans mon vrai code, je cherche des fichiers et des dossiers et je me suis trompé en copiant le code (car ce sont des extensions spécifiques à des logiciels que je recherche et non du txt).

    Je te remercie pour ta réponse et de ton "ébauche écrite à la va vite" de code que tu m'as fourni. Je vais bosser avec ça et voir si j'arrive à faire ce que tu m'as conseillé

  10. #10
    Expert confirmé
    Citation Envoyé par Nivek_33 Voir le message
    Bonjour MABROUKI,
    Merci pour la manip mais je sais comment afficher les fichiers cachés sur un ordi. Je ne sais pas comment tu fais pour voir "Documents and Settings" sur un Windows 10 par contre... y a que toi qui l'as non ?
    Autre point, je ne vois pas comment afficher les dossiers cachés va résoudre mon problème de droits d'accès.
    Peut-être as-tu plus de précisions à m'apporter ?
    Pour les droits d'acces c'est de niveau Admin.
    Maintenant pour ton "je sais comment afficher les fichiers cachés sur un ordi",j'ai dit "décocher masquer les fichiers et dossiers cachés DU SYSTÈME" .car il y a 2 catégories de fichiers cachés
    - fichiers cachés tout court par exemple par l'user cachottier
    - fichiers cachés système par l'Admin de l'ordi.


    bon code...

  11. #11
    Candidat au Club
    Hello Mabrouki,

    "décocher masquer les fichiers et dossiers cachés DU SYSTÈME" .car il y a 2 catégories de fichiers cachés
    Ok, j'ai trouvé ce dont tu me parlais. Je vois bien un dossier "Documents and settings" mais il est impossible de l'ouvrir et l'erreur reste lors de l'exécution du code.
    Je teste actuellement le code que m'a donné popo. Pour l'heure, je n'ai pas réussi à l'adapter correctement car la recherche ne fonctionne pas mais je continue de chercher.

    Merci à toi.

  12. #12
    Membre émérite
    Citation Envoyé par Nivek_33 Voir le message
    Hello Mabrouki,

    Ok, j'ai trouvé ce dont tu me parlais. Je vois bien un dossier "Documents and settings" mais il est impossible de l'ouvrir et l'erreur reste lors de l'exécution du code.
    Je teste actuellement le code que m'a donné popo. Pour l'heure, je n'ai pas réussi à l'adapter correctement car la recherche ne fonctionne pas mais je continue de chercher.

    Merci à toi.
    Comme expliqué précédemment, il faut attraper les exceptions remontées par GetDirectories et GetFiles lorsque tu lis des répertoires interdits.
    C'est d'ailleurs la seule chose qui manque à l'exemple que je t'ai donné.
    Après ça va lister les fichiers sans te donner l'emplacement où il a été trouvé, donc tu peux encore améliorer même après avoir géré les exceptions.
    Il restent encore bien d'autres choses que tu pourrais améliorer.
    Je te laisse chercher.

  13. #13
    Expert confirmé
    Citation Envoyé par Nivek_33 Voir le message
    Hello Mabrouki,



    Ok, j'ai trouvé ce dont tu me parlais. Je vois bien un dossier "Documents and settings" mais il est impossible de l'ouvrir et l'erreur reste lors de l'exécution du code.


    Merci à toi.
    En complement à mon précédent post (mode Admin ,décocher les fichiers cachés du systeme et autres fichiers cachés) pour l'ouvrir ce maudit dossier et contempler son contenu procéder comme suit:
    Select dossier Doc and Settings=> Proprietes => Security=>
    => Select Tout le monde(1 ère fois)
    => Clic Modifier (autorisations)
    => Select Tout le monde(2 eme fois)
    => Cochez Autoriser
    => Ok(dlg1)
    => Ok(dlg1)


    fermer la fenêtre Proprietes
    Select à Nouveau dossier Doc and Settings
    => clic (ouvrir)

    Ceci devrait être son contenu (du moins sur ma machine)
    AllUsers
    DefaultUser
    USERNAME( c'est l'admin)
    Public
    desktop.ini(fichier)

    tous ces sous-dossiers sont accessibles sauf DefaultUser(verouillé- mais justiciable du meme traitement que ci-dessus).

    Par code tu peux faire ceci mais au prealable tu dois avoir fait la manip ci-dessus(qui reste à coder & il faudra trouver l ce qui correspond à "Tout le monde") :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
     
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Security.AccessControl;
    using System.Security.Principal;
    namespace ConsoleApplication1
    {
     
        class Program
        {
     
            static void Main(string[] args)
            {
     
                try
                {
                    string dirName = @"C:\";
     
                    Console.WriteLine("Adding access control entry for " + dirName);
     
                     // Add ACL( access control entry to the directory)
                    AddDirectorySecurity(dirName, "USERNAME", FileSystemRights.ListDirectory, AccessControlType.Allow);
     
                    GetDirectoryNames(dirName);
     
     
     
                    Console.WriteLine("Removing access control entry from " + dirName);
     
                    // Remove ACL.
                    RemoveDirectorySecurity(dirName, "USERNAME", FileSystemRights.ReadData, AccessControlType.Allow);
     
                    Console.WriteLine("Done.");
     
                }
                catch (Exception ex)
                {
                    
                     Console.WriteLine(ex.Message);;
                }
     
                Console.ReadKey();
            }
            private static void GetDirectoryNames(string path )
            {
                DirectoryInfo  diRoot = new DirectoryInfo(path);
                Console.WriteLine("Root Directory :"+ diRoot.Name );
                GetFileNames(diRoot);
     
                Console.WriteLine("Directory Names :");
                foreach (var di in diRoot.GetDirectories())
    	        {
                    Console.WriteLine(di.Name);
                    GetFileNames(di);
                }
     
     
     
     
            }
            private static void GetFileNames(DirectoryInfo di)
            { 
                foreach (var fi in di.GetFiles())
    	        {
                    Console.WriteLine("      " + fi.FullName);
                    }
            }
     
            //  Adds an ACL entry on the specified directory for the specified account.
            private static void AddDirectorySecurity(string FileName, string Account, FileSystemRights Rights, AccessControlType ControlType)
            { 
                // Create a new DirectoryInfoobject.
                DirectoryInfo dInfo = new DirectoryInfo(FileName);
     
                // Get a DirectorySecurity object that represents the 
                // current security settings.
                DirectorySecurity  dSecurity = dInfo.GetAccessControl();
     
                // Add the FileSystemAccessRule to the security settings. 
                dSecurity.AddAccessRule(new FileSystemAccessRule(Account, Rights, ControlType));
     
                // Set the new access settings.
                dInfo.SetAccessControl(dSecurity);
            
            }
            // Removes an ACL entry on the specified directory for the specified account.
            private static void RemoveDirectorySecurity(string FileName, string Account, FileSystemRights Rights, AccessControlType ControlType)
            {
     
                // Create a new DirectoryInfoobject.
                DirectoryInfo dInfo = new DirectoryInfo(FileName);
     
                // Get a DirectorySecurity object that represents the 
                // current security settings.
                DirectorySecurity dSecurity = dInfo.GetAccessControl();
     
                // Add the FileSystemAccessRule to the security settings. 
                dSecurity.RemoveAccessRule(new FileSystemAccessRule(Account, Rights, ControlType));
     
                // Set the new access settings.
                dInfo.SetAccessControl(dSecurity);
     
            }
        }
    }

    bon code....

  14. #14
    Candidat au Club
    Merci Mabrouki.

    Je t'avoue que tout ça me semble compliqué pour mon niveau et le programme que je développe est à destination de collègues. La manipulation préalable serait quasi impossible à faire pour ceux qui ne sont pas à l'aise avec ce type de manipulations.
    Je garde bien-entendu tout ça sous le coude.
    Encore merci.

  15. #15
    Membre émérite
    MABROUKI,
    Ce n'est jamais une bonne idée d'essayer de contourner la sécurité mise en place.
    Si en plus tu dois également faire des manipulations à la main pour que ça fonctionne, c'est encore plus dangereux car tu ouvres des accès directement visible par l'utilisateur qui risque d'y mettre une grosse pagaille. Sans parler que tu ouvres également des portes à toute sorte de malwares.
    Si ces sécurités sont là, ce n'est pas pour rien.


    Nivek_33,
    Tu en es où avec le code que je t'ai donné ?
    Tu as catché les exceptions ?

  16. #16
    Candidat au Club
    Citation Envoyé par popo Voir le message
    MABROUKI,
    Ce n'est jamais une bonne idée d'essayer de contourner la sécurité mise en place.
    Si en plus tu dois également faire des manipulations à la main pour que ça fonctionne, c'est encore plus dangereux car tu ouvres des accès directement visible par l'utilisateur qui risque d'y mettre une grosse pagaille. Sans parler que tu ouvres également des portes à toute sorte de malwares.
    Si ces sécurités sont là, ce n'est pas pour rien.
    C'est aussi ce que je me suis dis ... Je bosse dans une grosse société (d'un point de vue informatique) et je ne peux pas prendre ce genre de risque.
    De toute façon, je ne suis même pas sûr qu'on ait les droits de faire ce type de manipulations. La DSI doit contrôler tout ça



    Nivek_33,
    Tu en es où avec le code que je t'ai donné ?
    Tu as catché les exceptions ?
    Je ne vais pas te mentir... je galère.
    Je cherche, je teste. Je regarde sur le net pour essayer de comprendre mais mon niveau débutant me met des bâtons dans les roues.
    En parallèle, j'ai aussi une autre fonction à développer, pour rechercher et supprimer des bases SQL.
    J'essaye d'avancer un peu sur les deux points. J'alterne quand j'en ai marre de bloquer sur un sujet
    Je sais que le projet est trop compliqué pour mon niveau mais c'est un projet que j'ai vraiment envie de mener, relativement rapidement, à son terme. Déjà 4 mois de développement dessus.

  17. #17
    Expert confirmé
    Citation Envoyé par Nivek_33 Voir le message
    Bonjour à tous,

    Dans le cadre d'un projet, je souhaite lancer une recherche de fichier d'une extension (.txt par exemple) sur l'ensemble du disque C:\
    Comme beaucoup d'autres avant moi, je rencontre une difficulté liée au répertoire "Documents and Settings".
    J'ai fouillé Internet (ce forum et d'autres, Youtube ...) sans trouver de solution à ma problématique.

    Dans les faits, je clique sur un bouton, la recherche se lance mais le programme s'arrête lorsqu'il arrive à C:\Documents and Settings.

    Je voudrais que le programme puisse continuer la recherche après cette erreur ou carrément, en ignorant ce satané répertoire.

    J'ai essayé avec un Try / Catch mais bon, ça m'affiche juste l'erreur dans un MessageBox par exemple et le programme stoppe la recherche.
    J'ai pensé à une boucle While ou for ou encore foreach. De ce que j'ai pu comprendre de ces fonctions, elles ne me permettraient pas de résoudre ma problématique car il faut déterminer une fin de boucle et, de ce que j'ai pu voir, c'est un nombre qui peut être déterminé alors que moi, c'est la fin de la recherche... je ne sais pas si c'est clair ^^

    J'ai également pu voir comme solution : exécuter le programme en tant qu'admionistrateur. J'ai essayé et ça ne fonctionne pas.

    Est-ce que l'un de vous a une solution/piste à m'apporter ?

    Je vous remercie par avance.

    Nivek
    Je reprends ton post initial & je cite le souci "Je voudrais que le programme puisse continuer la recherche après cette erreur ou carrément, en ignorant ce satané répertoire."

    le code exemple suivant répond à ce souci mais ,alas ,tu rencontreras d'autres sous dossiers "lucifériens ou diaboliques ou chaitaniques " qu'il faudra recenser à chaque exception & inclure dans le "if diabolique" pour les ignorer vertement.
    NB: le code est récursif car la structure de répertoire est récursive .
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Security.AccessControl;
    using System.IO;
     
    namespace ConsoleApplication2
    {
        class Program
        {
            private static string satanas =@"C:\Documents and Settings";
            static void Main(string[] args)
            {
                try
                {
     
                    string dirName = @"C:\" ;
     
     
                    DirectorySearch(dirName);
     
     
     
                    Console.WriteLine("Done.");
     
                }
                catch (Exception ex)
                {
     
                    Console.WriteLine(ex.Message); ;
                }
     
                Console.ReadKey();
            }
            private static void DirectorySearch(string dir)
            { 
     
                DirectoryInfo di   = new DirectoryInfo(dir);
     
                GetFileNames(dir);
                GetSubDirectoryNames(dir);
     
             }
     
            private static void GetSubDirectoryNames(string dir)
            {
                string[] subdirectoryEntries = Directory.GetDirectories(dir);
                // Loop through them to see if they have any other subdirectories  
                foreach(string subDir in subdirectoryEntries)
                {
                    DirectoryInfo di  = new DirectoryInfo(subDir);
                    Console.WriteLine(di.Name);
                    if (di.FullName == satanas  )
                    { 
                        Console.WriteLine(di.Attributes.ToString());
                        continue;
                    }
     
     
                    GetFileNames(subDir);
                    GetSubDirectoryNames(subDir);
                }
            }
     
            private static void GetFileNames(string dir)
            {
                string[] files  = Directory.GetFiles(dir, "*.*");
     
                //Loop through them to see files  
                foreach(string file in files)
                {    
                    FileInfo fi= new FileInfo(file);
                    Console.WriteLine("   "+fi.Name);
            
                }
            }
     
     
        }
    }

    Le diable en arabe se dit "chaitan".

    Quant à la manip manuelle déjà donnée ,elle peut être abrégé de la maniéré suivante .
    il suffit de taper dans la barre d'adresse de l'explorateur de fichier la commande "simplistic" suivante :
    "C:\Documents and Settings\%username%"
    pour contempler son contenu.
    bon code....

  18. #18
    Membre émérite
    Citation Envoyé par MABROUKI Voir le message
    Je reprends ton post initial & je cite le souci "Je voudrais que le programme puisse continuer la recherche après cette erreur ou carrément, en ignorant ce satané répertoire."

    le code exemple suivant répond à ce souci mais ,alas ,tu rencontreras d'autres sous dossiers "lucifériens ou diaboliques ou chaitaniques " qu'il faudra recenser à chaque exception & inclure dans le "if diabolique" pour les ignorer vertement.

    ...
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (di.FullName == satanas  )
    { 
        Console.WriteLine(di.Attributes.ToString());
        continue;
    }


    C'est la raison pour laquelle, j'ai dit qu'il fallait catcher ces exceptions et non pas tester chaque répertoire "diabolique" comme tu le suggère.

    Citation Envoyé par Nivek_33 Voir le message
    Je ne vais pas te mentir... je galère.
    Je cherche, je teste. Je regarde sur le net pour essayer de comprendre mais mon niveau débutant me met des bâtons dans les roues.
    En parallèle, j'ai aussi une autre fonction à développer, pour rechercher et supprimer des bases SQL.
    J'essaye d'avancer un peu sur les deux points. J'alterne quand j'en ai marre de bloquer sur un sujet
    Je sais que le projet est trop compliqué pour mon niveau mais c'est un projet que j'ai vraiment envie de mener, relativement rapidement, à son terme. Déjà 4 mois de développement dessus.
    Voici le code avec les exceptions gérées.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    public void SearchTextFiles(string currentDirectory, int currentDepth, int maxDepth, List<string> files)
    {
        string[] currentDirectoryFile;
        try
        {
            currentDirectoryFile = Directory.GetFiles(currentDirectory, "*.txt", SearchOption.TopDirectoryOnly);
        }
        catch
        {
            currentDirectoryFile = new string[] { };
        }
     
        files.AddRange(currentDirectoryFile);
     
        int depth = currentDepth + 1;
        if (depth <= maxDepth)
        {
            string[] directories;
            try
            {
                directories = Directory.GetDirectories(currentDirectory);
            }
            catch
            {
                directories = new string[] { };
            }
     
            foreach (string directory in directories)
            {
                SearchTextFiles(directory, depth, maxDepth, files);
            }
        }
    }


    Je l'ai incluse dans une classe Searcher et appelée de cette façon :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Searcher searcher = new Searcher();
    List<string> files = new List<string>();
     
    searcher.SearchTextFiles(@"C:\", 0, 4, files);
     
    foreach(string file in files)
    {
        Console.WriteLine(file);
    }
     
    Console.ReadKey();


    J'ai mis une profondeur de 4 pour que ça ne dure pas trop longtemps car faire une recherche sur tout le disque C pourrait prendre pas mal de temps selon le disque.
    Et ça me permettait de détecter le document que j'ai placé exprès pour test dans mon répertoire "Mes documents".
    Parmi les les quelques 471 entrée que ça m'a renvoyée, j'ai bien eu celle ci-ci.
    C:\Users\popo\Test.txt
    Mais aussi quelques entrées dans AllUsers.
    Bref, ça fonctionne sans devoir chercher quels répertoires sont diaboliques.

  19. #19
    Candidat au Club
    Merci Popo !
    Popo, un immense merci à toi !
    Tu ne sais pas à quel point tu viens de faire avancer mon projet (et très certainement plein d'autres à venir et pas uniquement pour moi !)
    En voyant le code, une chose est sûre : je n'aurais pas été capable de l'écrire avant bien longtemps.
    Je te confirme que ça fonctionne. Après plusieurs essais (car je ne faisais pas bien), j'ai réussi à lancer la recherche.
    Tout ne s'arrête pas là pour moi car je dois encore ajuster le code à mon programme car celui-ci doit permettre la recherche de plusieurs type de fichiers (plusieurs extensions différentes) en fonction de checkedbox sélectionnées ou non.
    Mais je pense que l'essentiel est là.
    Un immense merci.

###raw>template_hook.ano_emploi###