Si je comprends bien votre question (vous souhaitez répertorier non seulement les fichiers dans le répertoire sélectionné, mais aussi les sous-répertoires), vous voudrez regarder dans la méthode GetDirectories de la classe DirectoryInfo.
Vous pouvez faire quelque chose comme ça, peut-être:
DirectoryInfo di = new DirectoryInfo(strSelectedPath);
// first list sub-directories
DirectoryInfo[] dirs = di.GetDirectories();
foreach (DirectoryInfo dir in dirs)
{
listView1.Items.Add(dir.Name);
}
// then list the files
FileInfo[] files = di.GetFiles();
foreach (FileInfo file in files)
{
listView1.Items.Add(file.Name);
}
Mise à jour: Je vous suggère de déplacer le code ci-dessus dans une méthode distincte qui prend un paramètre de chaîne pour le chemin (quelque chose comme ListDirectoryContents(string path)
). Dans cette méthode, vous pouvez commencer par effacer les éléments de la vue de la liste, définir le texte de l'étiquette, puis ajouter du nouveau contenu comme ci-dessus.
Cette méthode peut être appelée à partir de votre méthode btnOpen_Click
, en passant le folderBrowserDialog1.SelectedPath
dans le paramètre path.
J'essaie habituellement de garder mes gestionnaires d'événements aussi petit que possible, de préférence astreint à aucun travail réel mais il suffit d'appeler une autre méthode qui fait le travail. Cela ouvre un peu plus pour déclencher la même fonctionnalité à partir d'autres endroits. Supposons par exemple que votre application puisse prendre un chemin en tant que paramètre de ligne de commande, alors ce sera du code plus propre en appelant simplement ListDirectoryContents
avec le chemin de la ligne de commande que peut-être dupliquer le même comportement dans votre formulaire.
exemple de code complet de cette approche:
private void btnOpen_Click(object sender, EventArgs e)
{
string path = BrowseForFolder();
if (path != string.Empty)
{
ListDirectoryContent(path);
}
}
private string BrowseForFolder()
{
FolderBrowserDialog fbd = new FolderBrowserDialog();
if (fbd.ShowDialog() == DialogResult.OK)
{
return fbd.SelectedPath;
}
return string.Empty;
}
private void ListDirectoryContent(string path)
{
label1.Text = path;
listView1.Items.Clear();
DirectoryInfo di = new DirectoryInfo(path);
// first list sub-directories
DirectoryInfo[] dirs = di.GetDirectories();
foreach (DirectoryInfo dir in dirs)
{
listView1.Items.Add(dir.Name);
}
// then list the files
FileInfo[] files = di.GetFiles();
foreach (FileInfo file in files)
{
listView1.Items.Add(file.Name);
}
}
Les aspects positifs de ce code est que vous pouvez réutiliser la méthode BrowseForFolder chaque fois que vous devez rechercher un dossier, car il retourne simplement le chemin sélectionné et n'est pas connecté à ce que le chemin sera utilisé. De même, la méthode ListDirectoryContent ignore complètement d'où provient le paramètre path; il peut provenir du navigateur de dossier, il peut provenir de la ligne de commande ou d'un autre emplacement.
Si vous vous concentrez sur vos méthodes ayant effectuer seulement leur « tâche essentielle », en se fondant sur les paramètres d'entrée pour toute information supplémentaire dont ils ont besoin, vous obtiendrez un code qui est plus facile à réutiliser et à entretenir.
Quand il vient aux gestionnaires d'événements (tels que btnOpen_Click), j'aime les voir comme déclencheurs; ils déclenchent des choses à se produire, mais ils ne font pas beaucoup eux-mêmes.
Je vois, le ListDirectoryContent avez-vous juste assigné le nom pour cela? Ou puis-je également sélectionner un autre nom? – tintincutes