Recherche récursive... Fonctionne, mais pas sur certain dossiers / fichiers [Résolu]

Signaler
Messages postés
3250
Date d'inscription
lundi 11 novembre 2013
Statut
Membre
Dernière intervention
18 avril 2021
-
Messages postés
3250
Date d'inscription
lundi 11 novembre 2013
Statut
Membre
Dernière intervention
18 avril 2021
-
Bonjour à tous.


Gros débutant que je suis, je cherche à apprendre en autodidacte le VB.Net.

Habituellement, je "scripte" en AutoIt...


J'ai donc décidé de faire la base des bases : une simple recherche récursive.

Ce script fonctionne (il recherche sur le bureau) :
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button2.Click

        'Dim NF = TextBox1.Text
        'Dim CT = TextBox2.Text
        'Dim DS = TextBox3.Text


        Dim cheminBUR = "C:\Users\tomce\Desktop"
        Dim CheminRDD = "C:\"

        For Each file As String In Directory.GetFiles(cheminBUR, "*.txt", SearchOption.AllDirectories)
            Console.WriteLine(file)
        Next

        Console.WriteLine("FIN")

    End Sub


J'ai bien la dite liste dans la console.

Ce script ne fonctionne pas :
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button2.Click

        'Dim NF = TextBox1.Text
        'Dim CT = TextBox2.Text
        'Dim DS = TextBox3.Text


        Dim cheminBUR = "C:\Users\tomce\Desktop"
        Dim CheminRDD = "C:\"

        For Each file As String In Directory.GetFiles(cheminRDD, "*.txt", SearchOption.AllDirectories)
            Console.WriteLine(file)
        Next

        Console.WriteLine("FIN")

    End Sub


J'ai comme erreur : exception non gérée.

ystem.UnauthorizedAccessException : 'L'accès au chemin d'accès 'C:\Documents and Settings' est refusé.'
-> https://i.imgur.com/vOvTYbw.png

J'ai donc décidé d'utiliser Catch .... Try

Plus d'erreur, mais une fois l'erreur trouvée, il s'arrête.

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button2.Click



        'Dim NF = TextBox1.Text
        'Dim CT = TextBox2.Text
        'Dim DS = TextBox3.Text


        ' premier




        Dim cheminBUR = "C:\Users\tomce\Desktop"
        Dim CheminRDD = "C:\"

        Try
            For Each file As String In Directory.GetFiles(cheminBUR, "*.txt", SearchOption.AllDirectories)
                Console.WriteLine(file)
            Next

        Catch uax As UnauthorizedAccessException

        End Try



        Console.WriteLine("FIN")

    End Sub



Pouvez-vous m'aider à finaliser la chose ?

merci.


++


3 réponses

Messages postés
15840
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 avril 2021
532
Re bonjour,

là pour le coup, c'est pas ce que j'appellerais la base de la base, mais bon.
Il faut que tu gères toi même la récursion.

Le sujet a été maintes fois traité sur la toile, certaines solutions sont plus abouties que d'autres
https://lite.qwant.com/?q=UnauthorizedAccessException+getfiles&client=opensearch

Si tu as lu l'article que j'ai écrit sur le passage de VB à VB.net, tu sais que VB.Net c'est du C#, donc toute solution en C# est applicable https://lite.qwant.com/?q=c%23+to+vb&client=opensearch
Messages postés
3250
Date d'inscription
lundi 11 novembre 2013
Statut
Membre
Dernière intervention
18 avril 2021

Bonjour.

Je passe en résolu.

Non pas parce que résolu, mais que ça devient un poil compliqué....

Petite parenthèse : désolée de la réponse tardive, mais avec le boulot, arffff ^^

Bref, j'essayais d'apprendre la recherche récursive. En aucun cas de créer un outil qui l'a déjà été, en largement mieux (Agent Ransack reste mon préféré).


Merci encore pour l'aide apportée.


++
Messages postés
3250
Date d'inscription
lundi 11 novembre 2013
Statut
Membre
Dernière intervention
18 avril 2021

Salut.

Suite à une énième curiosité de ma part, je voulais "encore" faire une recherche récursive...
Mais j'avais oublié (mémoire de ....) que j'avais créé un topic d'aide...


J'avais donc décidé de revenir demandé de l'aide, et je me suis aperçu que j'avais déjà sollicité la communauté pour la même chose...

J'ai donc bien fait de revenir, car, @Whismeril, tu m'avais mis sur la bonne voie en fait...
( comme d'habitude d'ailleurs ^^ )

En recherchant donc, via les liens données, je suis tombé sur cela :
https://codes-sources.commentcamarche.net/forum/affich-1643530-directory-getfiles-et-acces-refuse#15

Surtout ce passage :
    Private Sub Recherche(ByVal Chemin As String)
        Try
            For Each Fichier In System.IO.Directory.GetFiles(Chemin)
                ListFichiers.Items.Add(Fichier)
            Next
        Catch ex As Exception
            ListErreurs.Items.Add(ex.Message)
        End Try
        Try
            For Each Dossier In System.IO.Directory.GetDirectories(Chemin)
                Recherche(Dossier)
            Next
        Catch ex As Exception
        End Try
    End Sub


Donc, si j'ai bien compris :
- Je liste d'abord les fichiers dans le dossier de base
- puis je liste les dossier
- Chaque dossier listé, je refais une recherche de fichiers
- Et ainsi de suite, grâce au rappel de la fonction.

Sans oublier les deux try/catch/end try pour passer outre les fichiers/dossiers protégées

résultat : ça fonctionne...


Je peux passer vraiment en.... résolu :D


Je ne savais pas qu'on pouvait appeler la fonction dans la même fonction, donc merci de m'avoir aiguiller.

++
Messages postés
15840
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 avril 2021
532
Bonjour

de rien, surtout que
Je ne savais pas qu'on pouvait appeler la fonction dans la même fonction
c'est la définition de "récursivité" donc je prenais ça pour acquis.
Messages postés
3250
Date d'inscription
lundi 11 novembre 2013
Statut
Membre
Dernière intervention
18 avril 2021
>
Messages postés
15840
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 avril 2021

je l'avais acquis, mais sur un autre langage.

Ce n'est pas absolument la même syntaxe, ni la même conception...

Du coup, à l'époque, j'étais largué ^^


Largué au point de faire autrement...

    Private Sub Listing_swf_2()

        ListView1.Items.Clear()

        Dim fichier = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\fichier.txt"
        If My.Computer.FileSystem.FileExists(fichier) = True Then My.Computer.FileSystem.DeleteFile(fichier)

        Dim dirs() As String = Directory.GetLogicalDrives()
        Dim i As Long

        For i = dirs.GetLowerBound(0) To dirs.GetUpperBound(0)
            Dim LecteurOptique = dirs(i)
            Dim cmdline = "dir /b /s " & LecteurOptique & "*.swf* >> " & Chr(34) & fichier & Chr(34) & " & exit"

            Dim p As New ProcessStartInfo("cmd.exe", "/c " & cmdline)
            p.WindowStyle = ProcessWindowStyle.Hidden
            p.CreateNoWindow = True
            Process.Start(p).WaitForExit()

        Next i

        Dim contenu_f As String = File.ReadAllText(fichier)
        If My.Computer.FileSystem.FileExists(fichier) = True Then My.Computer.FileSystem.DeleteFile(fichier)


        Dim lignes() = Split(contenu_f, vbCrLf)

        Dim nb = "0"
        For Each ligne In lignes
            If My.Computer.FileSystem.FileExists(ligne) = True Then
                Dim ext = ligne.Substring(ligne.Length - 4)
                If ext = ".swf" Then
                    nb += 1
                    Dim itm = ListView1.Items.Add(nb)
                    itm.SubItems.Add(ligne)
                End If
            End If
        Next



    End Sub



XD


++