2009-05-24 7 views
4

Je suis très nouveau pour C#. Mon patron m'a demandé d'écrire du code en utilisant listview comme navigateur de fichiers. Je l'ai essayé et il semble que ça marche. Ce code est pour ouvrir les fichiers de vos lecteurs et l'afficher sur la liste. C'est très simple. J'ai également fait une fonction supplémentaire où l'on peut effacer les éléments affichés dans le listView. Je voudrais ajouter une fonctionnalité supplémentaire, où je peux également ouvrir le répertoire et pas seulement les fichiers. Par ailleurs, voici l'exemple de mon code:répertoires ouverture listview

private void btnOpen_Click(object sender, EventArgs e) 
    { 
     string strSelectedPath; 

     folderBrowserDialog1.ShowDialog(); 
     strSelectedPath = folderBrowserDialog1.SelectedPath; 

     label1.Text = strSelectedPath; 



     DirectoryInfo di = new DirectoryInfo(strSelectedPath); 
     FileInfo[] files = di.GetFiles(); 

     foreach (FileInfo file in files) 
     { 
      listView1.Items.Add(file.Name); 
     } 
    } 

    private void btnClear_Click(object sender, EventArgs e) 
    { 

     listView1.Items.Clear(); 
     label1.Text=""; 
    } 

Pourriez-vous s'il vous plaît me montrer comment?

Répondre

5

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.

+0

Je vois, le ListDirectoryContent avez-vous juste assigné le nom pour cela? Ou puis-je également sélectionner un autre nom? – tintincutes

0

La classe DirectoryInfo contient un GetDirectories, ainsi qu'un procédé GetFiles. Consultez votre exemple de code d'origine ci-dessous, modifié pour ajouter des répertoires:

private void btnOpen_Click(object sender, EventArgs e) 
{ 
    string strSelectedPath; 
    folderBrowserDialog1.ShowDialog(); 
    strSelectedPath = folderBrowserDialog1.SelectedPath; 
    label1.Text = strSelectedPath; 
    DirectoryInfo di = new DirectoryInfo(strSelectedPath); 
    FileInfo[] files = di.GetFiles(); 
    DirectoryInfo[] directories = di.GetDirectories(); 

    foreach (DirectoryInfo directory in directories) 
    { 
     listView1.Items.Add("Directory " + directory.Name); 
    } 
    foreach (FileInfo file in files) 
    { 
     listView1.Items.Add(file.Name); 
    } 
} 
+0

Est-il possible d'utiliser *** Tâches *** s'il y a beaucoup de fichiers? –

0

Je crois que c'est ce que vous voulez?

DirectoryInfo[] directories = di.GetDirectories(); 
    foreach (DirectoryInfo directory in directories) 
    { 
     listView1.Items.Add(directory.Name); 
    }