2009-05-24 3 views
4

Ich bin sehr neu in C#. Mein Chef hat mich gebeten, einen Code mit listview als Dateibrowser zu schreiben. Ich habe es versucht und es scheint, es funktioniert. Mit diesem Code öffnen Sie die Dateien von Ihren Laufwerken und zeigen sie in der listView an. Es ist sehr einfach. Ich habe auch eine zusätzliche Funktion, wo man die angezeigten Elemente in der ListView löschen kann. Ich möchte ein zusätzliches Feature hinzufügen, wo ich auch das Verzeichnis und nicht nur die Dateien öffnen kann. By the way, hier ist die Probe von meinem Code:listview Eröffnungsverzeichnisse

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=""; 
    } 

Könnten Sie mir bitte zeigen, wie?

Antwort

5

Wenn ich Ihre Frage richtig verstehe (Sie möchten nicht nur die Dateien im ausgewählten Verzeichnis, sondern auch die Unterverzeichnisse auflisten), sollten Sie in die GetDirectories-Methode der DirectoryInfo-Klasse schauen.

Sie könnten etwas tun, vielleicht:

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); 
} 

Update: Ich würde vorschlagen, dass Sie den obigen Code in ein separates Verfahren zu bewegen, die für den Pfad (so etwas wie ListDirectoryContents(string path)) einen String-Parameter annehmen. Bei dieser Methode können Sie mit dem Löschen der Elemente aus der Listenansicht beginnen, den Beschriftungstext festlegen und dann wie oben neuen Inhalt hinzufügen.

Diese Methode kann von Ihrer btnOpen_Click Methode aufgerufen werden, wobei folderBrowserDialog1.SelectedPath im Pfadparameter übergeben wird.

Ich versuche normalerweise, meine Event-Handler so klein wie möglich zu halten, vorzugsweise keine wirkliche Arbeit zu leisten, sondern nur eine andere Methode aufzurufen, die die Arbeit erledigt. Dies öffnet ein bisschen mehr für die gleiche Funktionalität von anderen Orten auszulösen.

Sagen Sie zum Beispiel, dass Ihre Anwendung einen Pfad als Befehlszeilenparameter erfolgen kann, dann wird es sauberer Code sein nur ListDirectoryContents mit dem Pfad von der Kommandozeile aufrufen, als vielleicht das gleiche Verhalten in der Form zu duplizieren.

Vollcodebeispiel dieses Ansatzes:

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); 
    } 

} 

Die upsides dieses Codes ist, dass Sie die Methode BrowseForFolder wieder verwenden können, wenn Sie für einen Ordner durchsuchen müssen, da sie einfach den ausgewählten Pfad zurück und ist nicht verbunden mit dem, wofür der Pfad verwendet wird. In ähnlicher Weise ist der ListDirectoryContent-Methode völlig unbekannt, woher der Pfadparameter kommt. Es kann aus dem Ordner-Browser stammen, es kann von der Befehlszeile oder irgendwo anders kommen.

Wenn Sie sich darauf konzentrieren, dass Ihre Methoden nur ihre "Kernaufgabe" ausführen und sich auf Eingabeparameter für zusätzliche Informationen verlassen, die sie benötigen, erhalten Sie Code, der leichter wiederzuverwenden und zu pflegen ist.

Wenn es sich um Ereignishandler (wie btnOpen_Click) handelt, sehe ich sie gerne als Auslöser; Sie lösen Dinge aus, aber sie tun selbst nicht viel.

+0

Ich sehe, der ListDirectoryContent haben Sie nur den Namen dafür vergeben? Oder kann ich auch einen anderen Namen wählen? – tintincutes

0

Die DirectoryInfo-Klasse enthält eine GetDirectories-Methode sowie eine GetFiles-Methode. Sehen Sie Ihr ursprüngliches Codebeispiel unten, das geändert wurde, um Verzeichnisse hinzuzufügen:

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

Ist es möglich, *** Tasks *** zu verwenden, wenn es viele Dateien gibt? –

0

Ich glaube, das ist, was Sie wollen?