Entwickler-Ecke
Basistechnologien - Konvertieren von FileInfo-Array in String-Array
Holonet - Do 20.10.11 14:59
Titel: Konvertieren von FileInfo-Array in String-Array
Hallo zusammen.
Ich bin total neu in C# und .NET und habe nur wenig Java-Erfahrung. Ich bin in Ausbildung und hab ein kleines Projekt zum bearbeiten, stecke jetzt aber fest und mein Betreuer ist krank.
Ich will eine Liste von allen Dateien haben, die sich in einem Verzeichnis befinden.
Dieses Verzeichnis wird durch einen folderBrowserDialog ausgewählt, in ein Textfeld gespeichert und dann zu einem String konvertiert und an eine Klasse übergeben, die dieses dann auslesen soll.
C#-Quelltext
1: 2: 3: 4:
| if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) { this.txtPath.Text = folderBrowserDialog1.SelectedPath; ListManager myListManager = new ListManager(this.txtPath.Text.ToString()); |
Im Konstruktor der Klasse will ich dann ein Array erstellen, dass alle Dateien des ausgewählten Verzeichnisses enthält und eine Methode programmieren, die die "Name"-Eigenschaft dieses Array vom Typ FileInfo in ein String-Array konvertiert, so dass ich den Dateinamen danach mit meinem Modell abgleichen kann.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| public ListManager(string path) { DirectoryInfo content = new DirectoryInfo(path); FileInfo[] files = content.GetFiles();
} |
Ich hab jetzt aber keinen Schimmer, wie ich weitermachen soll. Ich hab ein paar Tutorials gelesen, die haben mich aber auch nicht weiter gebracht. Könnt ihr mir einen schlauen Input geben?
gfoidl - Do 20.10.11 15:23
Hallo,
du kannst auch die Directory.GetFiles-Methode verwenden, diese gibt gleich ein string[] zurück.
Sonst kannst du z.B. mittels LinQ das string-Array erzeugen:
C#-Quelltext
1: 2: 3: 4:
| DirectoryInfo content = new DirectoryInfo(path); FileInfo[] files = content.GetFiles();
string[] fileNames = files.Select(f => f.Name).ToArray(); |
mfG Gü
Holonet - Do 20.10.11 15:54
Danke, funktioniert tadellos.
Ich nehme an das ist LINQ? Für was steht das kleine f?
dark-destination1988 - Do 20.10.11 16:01
das ist ein parameter und steht praktisch für ein element in der liste
Holonet - Do 20.10.11 16:16
Ich wollte jetzt einfach mal testweise den 1. Arrayeintrag in einem Labelfeld anzeigen und hab dazu folgenden Code geschrieben:
C#-Quelltext
1: 2: 3:
| ListManager myListManager = new ListManager(this.txtPath.Text.ToString());
lblTest.Text = myListManager.showArray(); |
Dazu die Methode:
C#-Quelltext
1: 2: 3: 4:
| public string showArray(string[] fileNames) { return fileNames[0]; } |
Logischerweise meckert nun der compiler, dass da Methodenkopf und Aufruf nicht übereinstimmen. Aber was muss ich da mitgeben? fileNames ist ja im Objekt myListManager enthalten und wenn ich bei der Methode den Parameter rausnehme kennt er das Array gar nicht mehr in der Methode.
Th69 - Do 20.10.11 18:55
Hallo Holonet,
du mußt aus "fileNames" eine Membervariable deiner Klasse machen:
C#-Quelltext
1:
| private string[] fileNames; |
Und im Konstruktor dann diese Membervariable füllen (anstatt eine lokale Variable anzulegen):
C#-Quelltext
1:
| fileNames = files.Select(f => f.Name).ToArray(); |
Holonet - Fr 21.10.11 11:17
Ihr seid super. Ich hoffe ich darf euch noch etwas mehr belästigen.
Ich will nun das string-Array auf einen bestimmten Datentyp hin durchsuchen. Und wo wir doch schon mit LinQ angefangen haben, kann man die Sache wohl auch damit beenden.
Ich hab mal versucht ne Query zusammenzubasteln, die mir alle Dateien mit der Endung ".csv":
C#-Quelltext
1:
| var result = (from f in fileNames where f.Contains(".csv") select f).ToArray(); |
Klappt auch soweit, in result werden alle *.csv-Dateien gespeichert.
Ich versteh aber nicht so richtig was das "var result" nun ist. Ne Variable vom Typ, der halt grade gebraucht wird?
Ralf Jansen - Fr 21.10.11 11:51
| Zitat: |
| Ich versteh aber nicht so richtig was das "var result" nun ist. Ne Variable vom Typ, der halt grade gebraucht wird? |
Nicht ganz. Var ist oft nur ein ~Platzhalter~ um Schreibarbeit zu sparen. Wenn der zugewiesene Typ schon zur Designzeit eindeutig bestimmbar ist. Bei deinem rechten Ausdruck kommt garantiert ein string[] raus also kann man sich es sparen das auch explizit als Typ hinzuschreiben und kann einfach var benutzen. Nach dem kompilieren ist var durch den konkreten Typ (string[]) ersetzt. Wenn du dein Kompilat disassemblieren würdest würdest du also nirgendwo ein var Typ finden.
Bei Linq wirst du häufiger var sehen da Linq mit anonymen Typen hantiert. Heißt der Typ ist zwar zur Designzeit eindeutig du kannst ihn aber nicht benennen (wie bei anonymen Dingen zu erwarten) und musst dann halt stattdessen var verwenden . Beispiel zu deinem Beispiel.
C#-Quelltext
1:
| var result = (from f in fileNames where f.Contains(".csv") select new { f, "ist ein CSV" }); |
Nun kommt als Ergebnis ein Neuer Typ bestehend aus deinem f und einen Text zurück. Du hast keine Chance ihn konkret zu benennen da dieser neue Typ(Klasse) noch keinen Namen hat. Bist also gezwungen var zu verwenden.
Th69 - Fr 21.10.11 11:58
Hallo Holonet,
ja, bei "var" ersetzt der Compiler den konkreten Typen selber (anhand des Rückgabetyps auf der rechten Seite), s.a.
var (C#-Referenz) [
http://msdn.microsoft.com/de-de/library/bb383973.aspx]
Gerade bei Linq kommt als Rückgabe häufig ein IEnumerable<T> bzw. IQueryable<T> heraus - und damit man dies sowie den konkreten Typ 'T' nicht immer als Programmierer selber hinschreiben muß, wurde das "var"-Schlüsselwort zur Sprache hinzugefügt (und bei anonymen Typen gibt es auch keine andere Möglichkeit, als "var" zu benutzen).
Zu exzessiv würde ich "var" jedoch nicht benutzen, da man dann das Programm nicht mehr so einfach versteht.
In deinem Fall wird ja aufgrund von "ToArray()" wieder ein "string"-Array zurückgeliefert, d.h.
C#-Quelltext
1:
| string[] result = (from f in fileNames where f.Contains(".csv") select f).ToArray(); |
wäre die manuelle Ersetzung.
Edit: das war ich wohl zu langsam...
Holonet - Mo 24.10.11 13:30
Weiter im Text... auch wenn es eigentlich nicht meh viel mit dem eigentlichen Thema des Threads zu tun hat.
Ich habe nun alle Dateien des Verzeichnisses gefiltert und in ein CheckListBox eingefügt. Dort soll der Benutzer nun die Dateien anhaken, die er konvertieren will. Über das Event "ItemCheck" will ich diese nun in ein weiteres Array abfüllen, dass ich dann einem Objekt übergeben kann, dass es in ein anderes Dateiformat umbenennt.
Dafür hab ich folgenden Code verwendet:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| private void lstbxContent_ItemCheck(object sender, ItemCheckEventArgs e) { if (e.NewValue == CheckState.Checked) { selectedList.Items.Add(lstbxContent.SelectedItem.ToString()); } else { selectedList.Items.Remove(lstbxContent.SelectedItem.ToString()); } } |
Da bekomm ich den Fehler an der "selectedList.Items...."-Stellen, da selectedList ja kein Objekt ist. Und jetzt steh ich grad total auf dem Schlauch, wie ich das in ein Array abfüllen kann.
Habs auch mal mit LinQ versucht:
C#-Quelltext
1:
| selectedList = (from c in lstbxContent where c. select c).ToArray(); |
Da komm ich bei der where-Klausel aber nicht weiter.
Th69 - Mo 24.10.11 17:31
Bitte erstelle dafür ein neues Thema mit sinnvollem Titel, da es nichts mehr mit diesem (und dessen Titel) zu tun hat. Ich werde dann diese Beiträge daraus löschen...
Holonet - Mi 26.10.11 11:23
Konnte diese Problem lösen. Danke für eure Hilfe.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!