IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Framework .NET Discussion :

Comment lister les fichiers dans un répertoire ?


Sujet :

Framework .NET

  1. #1
    Membre à l'essai
    Profil pro
    Formateur en informatique
    Inscrit en
    Octobre 2002
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 16
    Points : 17
    Points
    17
    Par défaut [Tout langage] Comment lister les fichiers dans un répertoire ?
    Bonjour, je cherche a faire un petit programme pour récuperer la liste des fichiers et sous répertoire d'un dossier. J'ai trouvé des codes mais il n'agisse que sur un niveau. Je souhaite pouvoir descendre dans chaque sous répertoire et avoir aussi le nom des fichiers. Afficher sous forme web pr exemple

    dossier 1
    - fichier 1
    - fichier 2
    - dossier 11
    -- fichier 111
    -- fichier 112....
    -- dossier 111
    --- fichier1111....
    - dossier 12
    dossier 2
    fichier 21

    Je ne sais pas comment faire pour faire cela. Si quelqu'un peu m'aider...

    Merci


    Patrice

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Une petite fonction récursive et le tour est joué

    C'est pas trop compliqué: juste un peu d'algo. Tu devrais trouvé cela assez facilement sur le net

  3. #3
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 53
    Points : 61
    Points
    61
    Par défaut
    hihi, la solution de Morpheus est la plus pure, mais pour toi il y a heureusement des "echapatoires".
    va voir ici: http://faqvbnet.developpez.com/?page=file tu devrais y trouver ton bonheur

  4. #4
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    PatricePatrice: la réponse peut être différente selon la version du framework utilisée bien que le principe reste celui suggéré par Morpheus , si tu nous donnes la version du framework et le langage souhaité, nous pourrons te répondre avec plus de précision

    par exemple (ceci sera certainement présent bientôt dans la Faq)
    Pour une application console en C# 2.0
    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
    /// <summary>
    ///  Méthode résursive qui affiche tous les dossiers, sous-dossiers 
    ///  et fichiers d'un répertoire
    /// </summary>
    /// <param name="folder">
    ///  String : chemin du dossier à explorer
    /// </param>
    /// <param name="indent">
    ///  Int32 : représente le nombre d'espaces à écrire pour indentation
    /// </param>
    private static void WriteFileEntries(String folder, Int32 indent)
    {
    // Créer une indentation du texte
    StringBuilder tab = new StringBuilder(String.Empty);
    for (int i = 0; i < indent; i++)
      { tab.Append(" ");}
    // Afficher les dossiers présents et leur contenu par récursivité
    String[] subdirs = Directory.GetDirectories(folder);
    // SI le dossier contient des sous-dossiers
    if (subdirs.Length != 0)
      {
       foreach (String s in subdirs)
        {
       // Afficher le nom du dossier à explorer
       Console.WriteLine(tab + Path.GetFileName(s));
       //Utiliser la récursivité avec une indentation
        WriteFileEntries(s, indent + 3);
        }
      }
    // Afficher les noms des fichiers présents
    String[] files = Directory.GetFiles(folder);
    // SI le dossier contient des fichiers
    if (files.Length != 0)
      {
      foreach (String s in files)
        { Console.WriteLine(tab + Path.GetFileName(s));}
      }
    }
    Pour le Web, je suppose qu'un Response.Write remplacera le Console.WriteLine
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  5. #5
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    avec cette methode on ne liste que les fichier et sous dossiers d'un repertoire
    => j'ai essayé de lister toutes l'arborescence d'un repertoire mais je n'y arrive pas : une solution ?

  6. #6
    Membre actif Avatar de scifire
    Inscrit en
    Juillet 2004
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 226
    Points : 245
    Points
    245
    Par défaut
    Je te propose une petite methode qui peut t'aider
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            public static void ShowContents(string directoryName)
            {
                string[] dNames = Directory.GetDirectories(directoryName);
                foreach (string dirName in dNames)
                {
                    Console.WriteLine(dirName);
                    ShowContents(dirName);
                }
                string[] fNames = Directory.GetFiles(directoryName);
                foreach (string fileName in fNames)
                {
                    Console.WriteLine(fileName);
                }
            }
    Peut-etre avant d'appeler la methode tu dois verifier si le repertoire existe
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                string dirName = @"...";
     
                if (Directory.Exists(dirName))
                {
                    ShowContents(dirName);
                }
    Even the biggest journey, starts with a single step.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 110
    Points : 140
    Points
    140
    Par défaut
    Utiliser une fonction en recursivité iterative.

    Je sais que ce terme peut choquer, mais ce sont des modes de fonctionnement de recursivité essentiel si on veux avoir assez de cordes à son arc.

    Voici un petit exemple ou l'on recupère dans un tableau le nom de tous les sous repertoires a n niveau d'un repertoire avec dans les 2 premiers caractère le niveau de sous repertoire.

    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
     
        Private Function parseDirectory(ByVal myDirInfo As System.IO.DirectoryInfo) As String()
            Dim sLstDir As String
            Dim result As String()
     
            sLstDir = lstDir(myDirInfo, 0)
            sLstDir = sLstDir.Substring(1, sLstDir.Length - 1)
            result = sLstDir.Split(";")
     
            Return result
        End Function
     
        Private Function lstDir(ByVal myDirInfo As System.IO.DirectoryInfo, ByVal myLevel As Integer) As String
            Dim aDir As System.IO.DirectoryInfo()
            Dim result As String = ""
            Dim i As Integer
     
            aDir = myDirInfo.GetDirectories()
     
            For i = 0 To aDir.GetUpperBound(0)
                result = result & ";" & twoDigit(myLevel + 1) & aDir(i).Name & lstDir(aDir(i), myLevel + 1)
            Next
     
            Return result
        End Function
     
        Private Function twoDigit(ByVal myInt As Integer) As String
            Dim Result As String = ""
     
            Select Case CBool(myInt > 9)
                Case True
                    If myInt > 99 Then
                        Result = "99"
                    Else
                        Result = myInt.ToString
                    End If
                Case False
                    If myInt < 0 Then
                        Result = "00"
                    Else
                        Result = "0" & myInt.ToString
                    End If
            End Select
     
            Return Result
        End Function
    Vous remarquerez que la fonction lstDir s'appel elle même de facon recurcive pour former une chaine de caractère de type
    resultat = resultat + fonction
    ce qui donne a n niveau une iteration de resultat concatené

    C'est ce que l'on nomme de la recurcivité iterative en opposition à de la recurcivité recurcive ou en fait on a un resultat de type :
    resultat = fonction(resultat)
    où le resultat s'imbrique à plusieurs niveaux.

    Evidemment mon code n'est qu'un exemple vite fait, mais fonctionne pour lister tous les sous-repertoires à n niveau d'un repertoire, j'ai mis tout ca dans un tableau à la fin pour être lisible mais libre à vous de trouver un autres formalisme pour s'adapter à vos besoin (remplir un treeview, etc..)

  8. #8
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    OK merci
    => en fait il me semble que le code donné en C# était bon mais que je ne le maitrise pas trop j'avais pas bien compris le code (en VB ça va mieux)...

  9. #9
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    au fait, est-il possible de faire une progress barre (je ne vois pas comment faire pour connaitre rapidement le nombre total de fichiers avant de lancer ma boucle)

  10. #10
    Membre actif Avatar de scifire
    Inscrit en
    Juillet 2004
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 226
    Points : 245
    Points
    245
    Par défaut
    Il s'agit d'une progress barre "non deterministe". On ne sait ni le nombre de fichiers ne le nombre de repertoires. On peut calculer ces nombres mais cela prendra du temps. Si tu veux avoir une progress barre tu dois utiliser une avec Marquee comme valeur de la propriete Style.
    Even the biggest journey, starts with a single step.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 110
    Points : 140
    Points
    140
    Par défaut
    Citation Envoyé par scifire
    On peut calculer ces nombres mais cela prendra du temps.
    C'est surtout que ca reviendrait à executer la procédure pour laquelle il veut faire une progress bar avant de l'afficher

    Dans ces cas là moi je prefère mettre un petit message de chargement avec une animation histoire de bien faire comprendre que les choses avances.

    Le problème avec les progress bar non deterministe c'est qu'elle ne reflete pas vraiment la progression réelle et que l'utilisateur à tendance à ne regarder que cela en pestant

  12. #12
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    donc si je comprend bien, il faut que je fasse comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                    RichTextBox1.Clear
            	ProgressBar1.Style = ProgressBarstyle.Marquee
            	listingDossiersFichiers(monChemin)
            	ProgressBar1.Style = progressbarstyle.Blocks
    en mettant un Application.DoEvents() dans ma procedure

    comment je fais si jeux veux quitter la boucle : pour l'instant si j'appuie sur la croix de la fenetre ça me fais des erreurs ?

  13. #13
    Membre actif Avatar de scifire
    Inscrit en
    Juillet 2004
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 226
    Points : 245
    Points
    245
    Par défaut
    L'appel a la methode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listingDossiersFichiers(monChemin)
    est synchrone ! Tu dois passer par un BackgroundWorker( pas neccessairement mais c'est assez facile) pour effectuer la tache en arriere plan dans un autre thread. A chaque petite progression, disons le traitement d'un fichier, tu vas appeler la methode ReportProgress du BackgroundWorker pour signaler a la progress barre qu'elle faut changer la valeur.
    Even the biggest journey, starts with a single step.

  14. #14
    Membre actif Avatar de scifire
    Inscrit en
    Juillet 2004
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 226
    Points : 245
    Points
    245
    Par défaut
    Voila un example vite fait.
    Code C# : 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
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
            }
     
            private void btnStart_Click(object sender, EventArgs e)
            {
                worker.RunWorkerAsync();
                btnStart.Enabled = false;
            }
     
            private void worker_DoWork(object sender, DoWorkEventArgs e)
            {
                for (int i = 0; i < 100; i++)
                {
                    System.Threading.Thread.Sleep(100);
                    if (worker.CancellationPending)
                    {
                        e.Cancel = true;
                        return;
                    }
                    worker.ReportProgress(i);
                }
            }
     
            private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                proBar.Value = e.ProgressPercentage;
            }
     
            private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                MessageBox.Show("Done");
                btnStart.Enabled = true;
            }
     
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                if (worker.IsBusy)
                {
                    worker.CancelAsync();
                }
            }
        }
    Je n'ai qu'un bouton(btnStart) et une progress barre(proBar) sur la fiche principale. J'espere que tu verras ce que j'ai voulu illustrer avec ce petit exemple.
    Even the biggest journey, starts with a single step.

  15. #15
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    j'ai pas tout compris

    voila mon code :
    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
    Sub listingSousDossiersRecur(Optional ByVal cheminBranche As String = ".", Optional ByVal objListRep As String() = nothing)
    		Dim pFichier As String()
    		Dim cFichiers As String()
     
    		'msgbox(cheminBranche)
     
    		richTextBox1.Select(richTextBox1.GetFirstCharIndexOfCurrentLine(), 1)
     
    		Dim currentFont As System.Drawing.Font = richTextBox1.SelectionFont
    		Dim newFontStyle As System.Drawing.FontStyle
     
    		'newFontStyle = FontStyle.Bold
    		newFontStyle = FontStyle.Underline xor FontStyle.Italic
    		richTextBox1.SelectionFont = New Font(currentFont.FontFamily, currentFont.Size, newFontStyle)
    		'richTextBox1.SelectionFont.b = Color.Red
    		RichTextBox1.AppendText(vbcrlf & cheminBranche & vbcrlf)
     
    		'Application.DoEvents()
    		System.Threading.Thread.Sleep(100)
     
    		pFichier = Directory.GetDirectories(cheminBranche)
    		cFichiers = Directory.GetFiles(cheminBranche)
     
    		Static Nbr1 As Double = 0
    		Static Nbr2 As Double = 0
    		Nbr1 += cFichiers.GetUpperBound(0) + 1
    		Nbr2 += pFichier.GetUpperBound(0) + 1
     
    		Label1.Text = "Nbr Fichiers : " & Ctype(Nbr1 + 1, string)
    		Label2.Text = "Nbr Dossiers : " & Ctype(Nbr2 + 1, string)
     
    		If objListRep is Nothing Then
    			objListRep = pFichier
    		End If
     
    		For Each fichier As String in cFichiers
    			Dim SplitFichier As String()
     
    		    SplitFichier = fichier.split(CType("\", char))
     
    		    Dim NomFichier As String = SplitFichier(SplitFichier.GetUpperBound(0))
     
    		    RichTextBox1.AppendText(NomFichier & vbcrlf)
    		Next fichier
     
    		'# Listing des sous-dossiers + appel recursif
    		For Each oSousRep As String In objListRep
    			Dim objListSousRep As String()
     
    			objListSousRep = Directory.GetDirectories(oSousRep)
     
    			listingSousDossiersRecur(oSousRep, objListSousRep)
    		Next	
    	End Sub
     
     
    	Sub Button1Click(sender As Object, e As System.EventArgs)
    		FolderBrowserDialog1.Description = "Choisissez votre répertoire"
     
        	If Button1.Text = "Lancer" Then
    	    	If FolderBrowserDialog1.ShowDialog(Me) = DialogResult.OK Then        	
    	        	RichTextBox1.Clear
    	        	ProgressBar1.Style = ProgressBarstyle.Marquee
    	        	BackgroundWorker1.RunWorkerAsync(FolderBrowserDialog1.SelectedPath)
    	        	'listingSousDossiersRecur(FolderBrowserDialog1.SelectedPath)
    	        	'ProgressBar1.Style = progressbarstyle.Blocks       	
    	    	End If
    	    Else
    	    	BackgroundWorker1.CancelAsync
    	    End If	   
    	End Sub
     
    	Sub BackgroundWorker1DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs)
    		Me.Button1.Text = "Annuler"
    		listingSousDossiersRecur(ctype(e.Argument, string))
    	End Sub
     
    	Sub BackgroundWorker1RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs)
    		ProgressBar1.Style = progressbarstyle.Blocks
    		Me.Button1.Text = "Lancer"	
    	End Sub
    => le pb, c que la recursivité de la fonction ne fonctionne plus (j'ai l'impression que ça ne la lance qu'une seule fois)...
    => aussi, il me semble que je n'ai pas le droit de changer les valeurs de mes autres controles...

    => la methode que j'avais proposée n'etait elle pas bonne ?

  16. #16
    Membre actif Avatar de scifire
    Inscrit en
    Juillet 2004
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 226
    Points : 245
    Points
    245
    Par défaut
    Je suis nul en VB.NET mais voila le meme example que j'ai code en C# cette fois en VB.NET.
    Code VB : 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
    Public Class Form1
     
        Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
            Me.btnStart.Enabled = False
            Me.worker.RunWorkerAsync()
        End Sub
     
        Private Sub worker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles worker.DoWork
            If worker.CancellationPending Then
                e.Cancel = True
                Exit Sub
            End If
            ' Recursif Function
            Func(100)
        End Sub
     
        Private Sub worker_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles worker.ProgressChanged
            Me.proBar.Value = e.ProgressPercentage
        End Sub
     
        Private Sub worker_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles worker.RunWorkerCompleted
            Me.btnStart.Enabled = True
        End Sub
     
        Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
            If Me.worker.CancellationPending Then
                Me.worker.CancelAsync()
            End If
        End Sub
     
        Private Function Func(ByVal i As Integer)
            If i = 0 Then
                System.Threading.Thread.Sleep(10)
                worker.ReportProgress(100)
                Return 0
            Else
                System.Threading.Thread.Sleep(10)
                worker.ReportProgress(Math.Abs(i - 100))
                Return Func(i - 1)
            End If
        End Function
    End Class
    Toujours sur la fiche il n'y a qu'un bouton, une progress barre et un BackgrounWorker. L'idee c'est d'illustre l'utilisation de backgroundworker avec l
    appel d'une fonction recursive.
    Even the biggest journey, starts with a single step.

  17. #17
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    je ne trouve toujours pas mon probleme

    voila ou j'en suis :

    j'ai créé un classe :
    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
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    Imports System.IO
     
    Public Class ListFiles
     
    	Public Event RunWorkerCompleted(sender As Object)
    	Public Event ProgressChanged(sender As Object)
     
    	Private mybackgroundWorker1 As System.ComponentModel.BackgroundWorker
     
    	Private myNbrFiles As Double = 0
    	Private myNbrDirectories As Double = 0
     
    	Private myMonChemin As String
     
    	Private myRichTextBox1 As RichTextBox
     
    	Private myNomDossier As String
    	Private myNomsFichiers As New ArrayList()
     
    ' ************************************************************************************************************
    ' *                  liste procédures
    ' ***********************************************************************************************************
     
     
    	Sub New(ByVal MonChemin As String)
    		myMonChemin	= MonChemin
    	End Sub
     
     
    	Public Sub Start()
    		AddHandler mybackgroundWorker1.DoWork, AddressOf Me.BackgroundWorker1DoWork
    		AddHandler mybackgroundWorker1.RunWorkerCompleted, AddressOf Me.BackgroundWorker1RunWorkerCompleted
    		AddHandler mybackgroundWorker1.ProgressChanged, AddressOf Me.BackgroundWorker1ProgressChanged
     
    		myRichTextBox1.Clear
    	    myBackgroundWorker1.RunWorkerAsync(myMonChemin)	
    	End Sub
     
    	Public Sub CancelAsync()
    		mybackgroundWorker1.CancelAsync	
    	End Sub
     
    	Private Sub listingSousDossiersRecur(Optional ByVal cheminBranche As String = ".", Optional ByVal objListRep As String() = nothing)
    		Dim pFichier As String()
    		Dim cFichiers As String()
     
    		'msgbox(cheminBranche)
     
    		System.Threading.Thread.Sleep(100)
     
    		myNomDossier = cheminBranche
     
    		'Application.DoEvents()
     
    		pFichier = Directory.GetDirectories(cheminBranche)
    		cFichiers = Directory.GetFiles(cheminBranche)
     
    		myNbrFiles += cFichiers.GetUpperBound(0) + 1
    		myNbrDirectories += pFichier.GetUpperBound(0) + 1
     
    		'Label1.Text = "Nbr Fichiers : " & Ctype(NbrFiles + 1, string)
    		'Label2.Text = "Nbr Dossiers : " & Ctype(NbrDirectories + 1, string)
    		'TextBox1.Text  = "Nbr Dossiers : " & CType(NbrDirectories + 1, String) & vbcr & _
    		'				 "Nbr Fichiers : " & Ctype(NbrFiles + 1, string)
     
    		If objListRep is Nothing Then
    			objListRep = pFichier
    		End If
     
    		myNomsFichiers.Clear
    		For Each fichier As String in cFichiers
    			Dim SplitFichier As String()		            
    		    SplitFichier = fichier.split(CType("\", char))		            
    		    Dim NomFichier As String = SplitFichier(SplitFichier.GetUpperBound(0))		    
    		    myNomsFichiers.Add (NomFichier)
    		Next fichier
     
     
    		'# Listing des sous-dossiers + appel recursif
    		For Each oSousRep As String In objListRep
    			Dim objListSousRep As String()
     
    			objListSousRep = Directory.GetDirectories(oSousRep)
     
    			listingSousDossiersRecur(oSousRep, objListSousRep)
    		Next	
    	End Sub
     
    	Private Sub MAJRichTextBox()
    		myRichTextBox1.Select(myrichTextBox1.GetFirstCharIndexOfCurrentLine(), 1)
     
    		' Mise en Forme du nom du Dossier
    		Dim currentFont As System.Drawing.Font = myrichTextBox1.SelectionFont
    		Dim newFontStyle As System.Drawing.FontStyle
    		'newFontStyle = FontStyle.Bold
    		newFontStyle = FontStyle.Underline xor FontStyle.Italic
    		myRichTextBox1.SelectionFont = New Font(currentFont.FontFamily, currentFont.Size, newFontStyle)
    		'richTextBox1.SelectionFont.b = Color.Red
    		myRichTextBox1.AppendText(vbcrlf & myNomDossier & vbcrlf)
     
    		For Each elm As String in myNomsFichiers
    			myRichTextBox1.AppendText(elm & vbcrlf)
    		Next elm
     
    		myRichTextBox1.AppendText(vbcrlf)		
    	End Sub
     
    ' ************************************************************************************************************
    ' *                  liste évenement
    ' ***********************************************************************************************************
     
     
    	Private Sub BackgroundWorker1DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs)
    		If mybackgroundWorker1.CancellationPending Then
                e.Cancel = True
                Exit Sub
            End If
            listingSousDossiersRecur(e.Argument)
    	End Sub
     
    	Private Sub BackgroundWorker1RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs)
    		RaiseEvent RunWorkerCompleted(sender)
    	End Sub
     
    	Private Sub BackgroundWorker1ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs)
     
    		If Not(myRichTextBox1 Is Nothing) Then
    			MAJRichTextBox
    		End If
     
    		RaiseEvent ProgressChanged(sender)
    	End Sub
     
     
    ' ************************************************************************************************************
    ' *                  liste propriétés
    ' ***********************************************************************************************************	
     
    	Public ReadOnly Property NbrFiles() As Double
    		Get 
    		    Return myNbrFiles
    		End Get		
    	End Property
     
    	Public ReadOnly Property NbrDirectories() As Double
    		Get 
    		    Return myNbrDirectories
    		End Get		
    	End Property
     
    	Public Property RichTextBox() As RichTextBox
    		Get 
    		    Return myRichTextBox1
    		End Get
     
    		Set(ByVal Value As RichTextBox)
    		    myRichTextBox1 = value
    		End Set	
    	End Property
     
     
    End Class

    et voici comment je l'utilise :
    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
    Option Explicit On
    option Strict On
    
    Imports System.IO
    
    Public Partial Class MainForm
    	Private maListFiles As ListFiles
    	
    	Public Sub New()
    		' The Me.InitializeComponent call is required for Windows Forms designer support.
    		Me.InitializeComponent()
    						
    		AddHandler Me.maListFiles.RunWorkerCompleted, AddressOf Me.maListFilesRunWorkerCompleted
    		AddHandler Me.maListFiles.ProgressChanged, AddressOf Me.maListFilesProgressChanged
    	End Sub
    	
    	
    	Sub Button1Click(sender As Object, e As System.EventArgs)
    		FolderBrowserDialog1.Description = "Choisissez votre répertoire"
        	    	
        	If Button1.Text = "Lancer" Then
    	    	If FolderBrowserDialog1.ShowDialog(Me) = DialogResult.OK Then        	
    	        	Me.Button1.Text = "Annuler"
    	        	ProgressBar1.Style = ProgressBarstyle.Marquee
    	        	
    	        	maListFiles = New ListFiles(FolderBrowserDialog1.SelectedPath)
    	        	
    	        	'RichTextBox1.Clear
    	        	'BackgroundWorker1.RunWorkerAsync(FolderBrowserDialog1.SelectedPath)
    	        	'listingSousDossiersRecur(FolderBrowserDialog1.SelectedPath)
    	        	'ProgressBar1.Style = progressbarstyle.Blocks       	
    	    	End If
    	    Else
    	    	maListFiles.CancelAsync
    	    End If	   
    	End Sub
    					
    	Sub maListFilesRunWorkerCompleted(sender As Object)
    		ProgressBar1.Style = progressbarstyle.Blocks
    		Me.Button1.Text = "Lancer"	
    	End Sub
    			
    	Sub maListFilesProgressChanged(sender As Object)
    		Me.Label1.Text = "Nbr Dossiers : " & maListFiles.NbrDirectories & vbCr & _
    						   "Nbr Fichiers : " & maListFiles.NbrFiles
    				
    	End Sub
    	
    	Sub CopierToolStripMenuItemClick(sender As Object, e As System.EventArgs)
    		Clipboard.SetDataObject(RichTextBox1.SelectedText, True)			
    	End Sub	
    	
    End Class
    => ça compile mais le programme ne se lance plus (message d'erruer) => pour pouvoir afficher ma userform, il faut que je supprime les lignes en rouge...

  18. #18
    Membre actif Avatar de scifire
    Inscrit en
    Juillet 2004
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 226
    Points : 245
    Points
    245
    Par défaut
    Salut je ne connais pas grande chose en VB.NET mais j'ai essaye de faire une petite application qui va t'aider j'espere
    Juste te dire que si tu lances l'application en mode debug elle emettra une exception qu'elle porte sur les threads Tu ne peux pas manipuler directement les proprietes des composants a partir d'un thread autre que celui qui a cree le composant parce que ce n'est pas une operation thread-safe. Tu dois utilise la methode Invoke() avec un delegate comme parametre. Le delegate va s'executer dans le thread du composant

    Bon couraga
    Encore une fois je repete je suis nul en VB.NET
    Fichiers attachés Fichiers attachés
    Even the biggest journey, starts with a single step.

  19. #19
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    pour quelqu'un qui est nul en vb, tu te demerde plutot bien

    par contre j'ai rien compris à ce que tu m'as dis
    je ne vois pas de "invoke" dans ton code

    voici mon projet :
    http://cjoint.com/?bekkgMzAaK

    => il me semble que j'ai fait a peu près la meme chose que toi a part que je passe par une classe (c'est pour simplifier la réutilisation)

Discussions similaires

  1. [XL-2007] Comment lister les fichiers contenus dans un répertoire Sharepoint
    Par Riri80 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 08/12/2020, 08h50
  2. Réponses: 5
    Dernier message: 25/06/2007, 23h25
  3. Réponses: 7
    Dernier message: 08/01/2007, 19h18
  4. Réponses: 13
    Dernier message: 24/08/2006, 13h05
  5. [CF][PPC/C#] Comment lister les fichiers d'un répertoire ?
    Par dady dans le forum Windows Mobile
    Réponses: 18
    Dernier message: 20/05/2005, 14h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo