Walter Doberenz, Thomas Gewinnus Visual C# 2008 Kochbuch ISBN-10: 3-446-41442-8 ISBN-13: 978-3-446-41442-6 Leseprobe Weitere Informationen oder Bestellungen unter http://www.hanser.de/978-3-446-41442-6 sowie im Buchhandel.
R8.3 Alle Dateien auflisten 465 R8.3 Alle Dateien auflisten Das vorliegende Rezept demonstriert, wie man mit der GetFiles-Methode zu einem gegebenen Verzeichnis alle Unterverzeichnisse ermitteln und in einem FileInfo-Array ablegen kann. Oberfläche Ein Formular mit einer ListBox genügt. Quellcode... using System.IO; public partial class Form1 : Form Die Anzeigeprozedur wird gleich zu Beginn (im Konstruktor von Form1) aufgerufen: public Form1() InitializeComponent(); listallfiles("c:\\", listbox1); Als Parameter werden der Anzeigeprozedur das übergeordnete Verzeichnis (hier Root-Directory) und eine ListBox übergeben: public void listallfiles(string pfad, ListBox lb) Ein DirectoryInfo-Objekt anlegen: DirectoryInfo mydir = new DirectoryInfo(pfad); Array zum Speichern der Dateien anlegen: FileInfo[] myfiles; Alle im Verzeichnis enthaltenen Dateien ermitteln und das Array füllen: myfiles = mydir.getfiles(); Das Array durchlaufen und die Dateinamen zur ListBox hinzufügen: for (int i = 0; i < myfiles.length; i++) lb.items.add(myfiles[i].name);
466 Kapitel 8: Dateien/Verzeichnisse Test Alle im Verzeichnis C:\ enthaltenen Dateien werden sofort nach Programmstart aufgelistet: R8.4 Die GetFileSystemInfos-Methode verwenden Als Alternative zu den Vorgängerrezepten R8.2 und R8.3 zeigen wir hier eine weitere Möglichkeit, alle in einem Verzeichnis enthaltenen Unterverzeichnisse und Dateien aufzulisten. Oberfläche Ein Formular mit einer ListBox soll uns genügen. Quellcode... using System.IO; public partial class Form1 : Form public Form1() InitializeComponent(); Auch in diesem Testprogramm ist die Root-Directory Gegenstand der Untersuchungen: listfilesysteminfos("c:\\", listbox1); Der Anzeigemethode werden ein Verzeichnispfad und eine ListBox-Referenz übergeben: public void listfilesysteminfos(string pfad, ListBox lb)
R8.4 Die GetFileSystemInfos-Methode verwenden 467 Auch hier beginnt alles mit einem DirectoryInfo-Objekt: DirectoryInfo mydir = new DirectoryInfo(pfad); Jetzt werden alle dazugehörigen Einträge ermittelt: FileSystemInfo[] fsi = mydir.getfilesysteminfos(); Zunächst den vollständigen Verzeichnispfad anzeigen: lb.items.add(mydir.fullname);... dann alle Unterverzeichnisse und Dateien: foreach (FileSystemInfo info in fsi) lb.items.add(info.name); Test Nach Programmstart werden alle in der Root des Laufwerks C: enthaltenen Unterverzeichnisse und Dateien angezeigt:
468 Kapitel 8: Dateien/Verzeichnisse R8.5 Die Path-Klasse kennen lernen Eine Alternative zur File-Klasse ist die Path-Klasse. In diesem Rezept wollen wir einige ihrer zahlreichen (statischen) Methoden demonstrieren. Oberfläche Auch hier genügt uns (neben dem Startformular Form1) eine ListBox. Quellcode... using System.IO; public partial class Form1 : Form public Form1() InitializeComponent(); Beim Aufruf der Testmethode sind der vollständige Namen einer vorhandenen Datei und eine ListBox-Referenz zu übergeben: getinfos("c:\\temp\\test.txt", listbox1); Die Testmethode: public void getinfos(string datname, ListBox lb) lb.items.add("verzeichnis : " + Path.GetDirectoryName(datName)); lb.items.add("dateiname : " + Path.GetFileName(datName)); lb.items.add("dateiname ohne Extension : " + Path.GetFileNameWithoutExtension(datName)); lb.items.add("dateiextension : " + Path.GetExtension(datName)); lb.items.add("rootverzeichnis : " + Path.GetPathRoot(datName)); lb.items.add("temporäres Verzeichnis : " + Path.GetTempPath()); lb.items.add("neues Tempfile : " + Path.GetTempFileName()); Test Voraussetzung für einen erfolgreichen Test ist das Vorhandensein einer Datei c:\temp\test.txt.
R8.6 Verzeichnis- und Datei-Informationen gewinnen 469 HINWEIS: Vorsicht ist geboten, denn die meisten Member der Path-Klasse wirken nicht mit dem Dateisystem zusammen und überprüfen deshalb nicht, ob die durch eine Pfadzeichenfolge angegebene Datei auch tatsächlich vorhanden ist! R8.6 Verzeichnis- und Datei-Informationen gewinnen Dieses Rezept zeigt Ihnen nicht nur den Einsatz der DirectoryInfo- und FileInfo-Klasse, sondern auch weiteres nützliches Handwerkszeug, wie z.b. die sinnvolle Verknüpfung zweier ListBox- Komponenten. Oberfläche Auf Form1 platzieren wir eine TextBox-, zwei ListBox- und zwei große Label- Komponenten im 3D-Outfit (siehe Laufzeitabbildung). Quelltext... using System.IO; public partial class Form1 : Form... Globale Deklarationen auf Form1-Ebene: private string myroot = "C:/"; private string mydirname, myfilename; private const char CrLf = (char) 10; // übergeordnetes Verzeichnis // aktuelles Unterverzeichnis bzw. Datei // Zeilenumbruch Beim Laden werden zunächst alle Unterverzeichnisse von C:/ angezeigt: private void Form1_Load(object sender, EventArgs e) textbox1.text = myroot;
470 Kapitel 8: Dateien/Verzeichnisse showdirectories(); Die folgende Methode zeigt alle zu myroot untergeordneten Verzeichnisse an: private void showdirectories() DirectoryInfo[] mydirectories; // Array zum Speichern der Unterverzeichnisse Erzeugen eines neuen DirectoryInfo-Objekts, welches auf das Rootverzeichnis zeigt: DirectoryInfo mydirectory = new DirectoryInfo(myRoot); Alle Unterverzeichnisse ermitteln und abspeichern (vorher Anzeige löschen): mydirectories = mydirectory.getdirectories(); listbox1.items.clear(); Alle Verzeichnisse durchlaufen... for (int i = 0; i < mydirectories.length; i++)... und Verzeichnisnamen anzeigen: listbox1.items.add(mydirectories[i].name); Der erste Eintrag in der Verzeichnis-ListBox wird selektiert, dadurch wird das SelectedIndex- Changed-Event ausgelöst: listbox1.selectedindex = 0; Synchronisieren aller Dateien in der rechten ListBox mit dem selektierten Verzeichnis und Anzeige der Verzeichnis-Informationen: private void listbox1_selectedindexchanged(object sender, EventArgs e) DirectoryInfo mydirectory; // aktuelles Verzeichnis string dirinfo = String.Empty; FileInfo[] myfiles; // Array für alle Dateiinformationen listbox2.items.clear(); // aktuellen Inhalt löschen Neues DirectoryInfo-Objekt aufgrund des selektierten ListBox-Eintrags erzeugen: mydirname = listbox1.selecteditem.tostring() + "/"; mydirectory = new DirectoryInfo(myRoot + mydirname); Verzeichnis-Infos zusammensetzen: dirinfo += "Pfad: " + mydirectory.fullname + CrLf; dirinfo += "Erstellungsdatum: " + mydirectory.creationtime + CrLf; dirinfo += "Attribute: " + mydirectory.attributes.tostring() + CrLf; label1.text = dirinfo;
R8.6 Verzeichnis- und Datei-Informationen gewinnen 471 Alle im Verzeichnis enthaltenen Dateien dem FileInfo-Array zuweisen: try myfiles = mydirectory.getfiles(); File-Array durchlaufen und die Dateien zur ListBox hinzufügen: if (myfiles.length > 0) for (int i = 0; i < myfiles.length; i++) listbox2.items.add(myfiles[i].name); Ersten Eintrag in der Datei-ListBox selektieren, dadurch wird deren SelectedIndexChanged- Event ausgelöst: listbox2.selectedindex = 0; catch (Exception ex) MessageBox.Show(ex.Message); Zweck des folgenden Eventhandlers ist es, den Inhalt des Labels "Datei-Informationen" zu aktualisieren: private void listbox2_selectedindexchanged(object sender, EventArgs e) FileInfo myfile; string fileinf = String.Empty; Die Dateinamen zuweisen: myfilename = listbox2.selecteditem.tostring(); Neues File-Objekt erzeugen: myfile = new FileInfo(myRoot + mydirname + myfilename); Datei-Infos zusammensetzen und anzeigen: fileinf += "Verzeichnis: " + myfile.directoryname + CrLf; fileinf += "Erstellungsdatum: " + myfile.creationtime + CrLf; fileinf += "Größe: " + myfile.length + " Byte" + CrLf; fileinf += "Letzter Zugriff: " + myfile.lastaccesstime + CrLf; fileinf += "Attribute: " + myfile.attributes.tostring() + CrLf; label2.text = fileinf;
472 Kapitel 8: Dateien/Verzeichnisse Wenn Sie das übergeordnete Verzeichnis in textbox1 eingetragen haben, kann die Enter-Taste ausgewertet werden um die Eingabe abzuschließen: private void textbox1_keyup(object sender, KeyEventArgs e) if (e.keycode == Keys.Enter) myroot = textbox1.text; Mit einem kleinen Trick den letzten Slash ergänzen, falls notwendig: if (!myroot.endswith("/")) myroot += "/"; showdirectories(); Test Bei Programmstart erscheinen zunächst in der linken ListBox alle Unterverzeichnisse zur Root C:/. Klicken Sie nun auf ein Unterverzeichnis, um sich in der rechten ListBox die darin enthaltenen Dateien anzeigen zu lassen. HINWEIS: Wenn Sie sich in der Verzeichnishierarchie von oben nach unten weiterbewegen wollen, müssen Sie das Hauptverzeichnis in der TextBox per Hand ergänzen und die Eingabe mit der Enter-Taste abschließen.
R8.7 Änderungen im Dateisystem überwachen 473 Ziemlich häufig kann es aber auch (insbesondere unter den restriktiven Sicherheitseinstellungen von Windows Vista) zu folgender Fehlermeldung kommen: R8.7 Änderungen im Dateisystem überwachen Dieses Rezept zeigt, wie Sie unter Verwendung der Klasse FileSystemWatcher das Dateisystem beobachten können. Wichtige Eigenschaften sind: NotifyFilter Typ der zu überwachenden Änderung (in NotifyFilters-Enumeration enthalten, z.b. Attributes, CreationTime, DirectoryName, FileName, LastAccess, Size,...) Filter Filterzeichenfolge für die zu überwachenden Dateien EnableRaisingEvents Aktivieren der Komponente (True/False) Wichtige Ereignisse sind: Changed Datei oder Verzeichnis wurde geändert Created Datei oder Verzeichnis wurde erzeugt Deleted Datei oder Verzeichnis wurde gelöscht Renamed Datei oder Verzeichnis wurde umbenannt Oberfläche Ein Formular mit einer ListBox und einem Button soll genügen.