Entwickler-Ecke
C# - Die Sprache - Ordner auslesen und in CheckedListBox einlesen
epinephrine87 - Do 02.07.09 17:47
Titel: Ordner auslesen und in CheckedListBox einlesen
Hallöchen :-)
Ich bin relativ neu im bereich CSharp/C# und habe ein kleines Problem bzw. Mehrere aber dazu später mehr.
Mein erstes Problem besteht darin dass ich bei
C#-Quelltext
1: 2: 3: 4: 5: 6:
| string path = "D:\\ArmA 2"; foreach (string mods in Directory.GetFiles(path)); checkedListBox1.Items.Add(mods); |
leider in der letzten zeile die Variable unterstrichen bekomme also diese quasi garnicht ansprechbar ist, woran könnte das liegen?
Das nächste Problem bestände darin dass die Ordner ein @ vor dem Namen tragen welches ich gern in der Liste nicht sehen möchte, kann mir beim besten willen aber nicht vorstellen wie das funktionieren soll.
Dann wäre da noch die Auswahl der Checkboxes in der Liste, wo ich wiederum nicht weis wie ich diese dynamisch ausgeben kann, denn bei jeder checkbox müsste die variable "-mod=@ordnername " ausgeben und damit komme ich nicht klar.
Würde mich freuen wenn mir da jemand weiterhelfen könnte.
Mfg
Andi
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt
jaenicke - Do 02.07.09 18:28
Hallo und :welcome: !
Durch das Semikolon am Ende der foreach Zeile schließt du den Befehl ab. Wenn du den folgenden Befehl darin ausführen willst, dann nimm das Semikolon weg. ;-)
epinephrine87 - Do 02.07.09 18:34
jaenicke hat folgendes geschrieben : |
Hallo und :welcome: !
Durch das Semikolon am Ende der foreach Zeile schließt du den Befehl ab. Wenn du den folgenden Befehl darin ausführen willst, dann nimm das Semikolon weg. ;-) |
Hey danke :) nun funktionier zumindest schonmal die ausgabe, nur wie gebe ich ihm jetzt den befehl er soll nur ordner anzeigen die mit @ beginnen, aber gleichzeitig in der ausgabe das @ rausfiltern?
Kato - Do 02.07.09 18:58
Hallo epinephrine87,
mit
C#-Quelltext
1: 2: 3: 4:
| if(mods.StartsWith("@")) { checkListBox1.Items.Add(mods); } |
dürfte er nur die Strings beginnend mit einem @ an deiner Liste anfügen.
jaenicke - Do 02.07.09 18:58
Naja, den ersten Buchstaben prüfen und ggf. dann entfernen und in die Liste eintragen. Das sollte so gehen:
C#-Quelltext
1: 2:
| if (mods[0] == "@") checkedListBox1.Items.Add(mods.SubString(1, mods.Length - 1)); |
// EDIT:
Ach ja, StartsWith gibts auch, daran habe ich mich gar nicht erinnert. Aber als zweite Zeile passt dann ja das von mir mit SubString. :D
// EDIT2:
Und :welcome: an
Kato. :D
Kato - Do 02.07.09 18:59
*edit* woops, verklickt oder so
epinephrine87 - Do 02.07.09 19:04
Kato hat folgendes geschrieben : |
*edit* woops, verklickt oder so |
Hmm ja das mache ich ja, aber die box bleibt leer, wahrscheinlich weil der code nur nach files und nicht folders sucht, finde aber für die Suche nach ordnern keinen Passenden befehl oO
Kato - Do 02.07.09 19:06
um Ordner auszulefen versuch es mal mit
C#-Quelltext
1:
| Directory.GetDirectories("C:\Pfad", "", SearchOption.TopDirectoryOnly); |
Bin mir nicht sicher, habe es nicht ausprobiert, nur beim kurzem nachsehen entdeckt.
Und danke an jaenicke :)
EDIT: oh man, der jaenicke ist schneller als ich ;)
JüTho - Do 02.07.09 19:10
epinephrine87 hat folgendes geschrieben : |
... finde aber für die Suche nach ordnern keinen Passenden befehl oO |
Directory.GetFiles hat auch eine Überladung mit
SearchOption. Alternativ kannst du auch mit
GetDirectories arbeiten oder die Methoden von DirectoryInfo benutzen (je nachdem, worauf es dir ankommt).
Gruß Jürgen
Ach, andere waren schneller.
epinephrine87 - Do 02.07.09 19:28
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| private void Form1_Load(object sender, EventArgs e) { ///Deklaration "Path" im späteren Verlauf per Usereingabe. string path = "D:\\ArmA 2"; ///Auflistung foreach (string mods in Directory.GetDirectories(path)) { if (mods.StartsWith("@")) { checkedListBox1.Items.Add(mods); } } |
Funktioniert nicht, also es wird nichts angezeigt obwohl im Zielverzeichnis ein ordner mit einem @ vorne dran existiert.
Genauso auch mit dem
Quelltext
1: 2:
| if (mods[0] == "@") checkedListBox1.Items.Add(mods.SubString(1, mods.Length - 1)); |
und dem
Quelltext
1:
| Directory.GetDirectories("C:\Pfad", "", SearchOption.TopDirectoryOnly) |
entweder bin ich echt Dumm oder aber es funktioniert in der Tat so nicht.
Kann das sein dass ich das @ mit einer Char ID ersetzen muss?
jaenicke - Do 02.07.09 20:03
Ich habe vergessen, dass GetDirectories den kompletten Pfad zurückliefert. Abgesehen davon muss man ja nicht selbst filtern, so sollte es klappen:
C#-Quelltext
1: 2:
| foreach (string mods in Directory.GetDirectories(path, "@*")) checkedListBox1.Items.Add(mods); |
epinephrine87 - Do 02.07.09 20:13
jaenicke hat folgendes geschrieben : |
Ich habe vergessen, dass GetDirectories den kompletten Pfad zurückliefert. Abgesehen davon muss man ja nicht selbst filtern, so sollte es klappen: C#-Quelltext 1: 2:
| foreach (string mods in Directory.GetDirectories(path, "@*")) checkedListBox1.Items.Add(mods); | |
tatsache es funktioniert Danke :) jetzt währe nurnoch hilfreich wie ich das x:\pfad\@ entfernen kann.. also dass er mir in der Liste nurnoch anstatt x:pfad\@ordnername, ordnername anzeigt.
Kato - Do 02.07.09 20:21
du könntest mit "mods.Split(@'\')"; arbeiten und einfach das letzt Element nehmen. Die Split Funktion teil einen String in mehrere Teile und zwar an der stelle wo der "seperator" steht. Also wenn du der Funktion ein 'e' übergibst trennt er immer da wo ein e steht. Du bekommst von der Funktion ein string[] zurück, wobei die seperatoren quasi "rausgelöscht" sind.
Beispiel
C#-Quelltext
1: 2:
| string s = @"Das\ist\mein\Text"; string[] arr = s.Split(@'\'); |
Der inhalt von arr ist dann folgender
C#-Quelltext
1: 2: 3: 4:
| arr[0] = "Das"; arr[1] = "ist"; arr[2] = "mein"; arr[3] = "Text"; |
jaenicke - Do 02.07.09 20:31
Wie wäre es eher so:
C#-Quelltext
1: 2:
| foreach (string mods in Directory.GetDirectories(path, "@*")) checkedListBox1.Items.Add(Path.GetFileName(mods).Substring(1)); |
Nebenbei: Deine Variable path zu nennen ist suboptimal...
Nimm lieber aussagekräftige Bezeichner, die so vermutlich nicht auch irgendwo schon existieren werden (hier System.IO.Path). ;-)
epinephrine87 - Do 02.07.09 20:57
jaenicke hat folgendes geschrieben : |
Wie wäre es eher so: C#-Quelltext 1: 2:
| foreach (string mods in Directory.GetDirectories(path, "@*")) checkedListBox1.Items.Add(Path.GetFileName(mods).Substring(1)); | Nebenbei: Deine Variable path zu nennen ist suboptimal...
Nimm lieber aussagekräftige Bezeichner, die so vermutlich nicht auch irgendwo schon existieren werden (hier System.IO.Path). ;-) |
Hmm mit Substring wäre eine Gute Idee doch der Pfad ist immer unterschiedlich, denn nicht jeder Spieler hat das Spiel auf dem Selben Pfad Installiert, ansonsten hätte ich ja sogut wie garkeine probleme damit gehabt.
Und Kato sein Code funktioniert nicht, das @'\' wird unterstrichen.
ich hätte da jetzt eine idee wie es funktionieren könnte, und zwar nimmt man "path" berechnet wieviele Zeichen dieser hat, und nimmt die Anzahl als Substring...
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| private void button5_Click(object sender, EventArgs e) { folderBrowserDialog1.ShowDialog(); string folderpath = folderBrowserDialog1.SelectedPath; textBox1.Text = folderpath; string path = folderpath; foreach (string mods in Directory.GetDirectories(path, "@*")) { int laenge = path.Length; checkedListBox1.Items.Add(Path.GetDirectoryName(mods).Substring(laenge)); } } |
Einziges Problem, ich bekomme NUR die Checkbox angezeigt ohne Label.. wenn ich jetzt z.B. "int laenge = path.Length -5; nutze zeigt er mir Nur die Zeichen vor dem @ an oO also quasi "rmA\"
jaenicke - Do 02.07.09 20:59
epinephrine87 hat folgendes geschrieben : |
Hmm mit Substring wäre eine Gute Idee doch der Pfad ist immer unterschiedlich, denn nicht jeder Spieler hat das Spiel auf dem Selben Pfad Installiert, ansonsten hätte ich ja sogut wie garkeine probleme damit gehabt. |
Was hat das damit zu tun? :gruebel:
Der Code nimmt den letzten Teil des Pfades und davon den Teil des Strings ab den zweiten Zeichen...
Habs grad getestet, klappt problemlos.
jaenicke - Do 02.07.09 23:13
Was steht denn bei dir in mods drin? Ist da am Ende ein Backslash dran?
Wenn nein: Hast du sicher GetFileName benutzt?
Bei mir ist in mods am Ende kein Pfadtrennzeichen und dann funktioniert es problemlos. :nixweiss:
epinephrine87 - Do 02.07.09 23:45
jaenicke hat folgendes geschrieben : |
Was steht denn bei dir in mods drin? Ist da am Ende ein Backslash dran?
Wenn nein: Hast du sicher GetFileName benutzt?
Bei mir ist in mods am Ende kein Pfadtrennzeichen und dann funktioniert es problemlos. :nixweiss: |
Ahh es funktionier, ich trottel habe es wie folgt geschrieben:
Quelltext
1: 2: 3: 4:
| foreach (string mods in Directory.GetDirectories(path, "@*")) { checkedListBox1.Items.Add(Path.GetFileName(mods).Substring(1)); } |
Also die Brackets hinzugefügt, habe sie nun entfernt und es geht einwandfrei :) Danke!
jaenicke - Do 02.07.09 23:50
Eigentlich sollte das keinen Unterschied machen, aber gut, dass es jetzt funktioniert. Das ist ja das Wichtigste. ;-)
Kato - Fr 03.07.09 00:02
bin davon ausgegangen das der komplette Pfad zurückgegeben wird, desswegen die Split() Funktion.
jaenicke - Fr 03.07.09 00:05
Wird er ja auch. ;-)
GetFileName gibt den Teil des Pfades nach dem letzten Backslash zurück und SubString gibt davon den Teil ab dem angegebenen Zeichen, hier dem zweiten, zurück.
Kato - Fr 03.07.09 00:35
Ach hab das Path nicht gesehen :/
epinephrine87 - Fr 03.07.09 02:56
Soo jetzt hätte ich da noch eine klitzekleine Frage:
Wie kann ich nun dafür sorgen dass mir die checkboxen bei "checked"
Folgendes zurück geben: "-mod=@checkbox1name -mod=@checkbox2name" etc.. also ich möchte ein Tool schreiben welches eine variable auswahl von Mods erlaubt und jedes mod muss als startparameter bei einer .exe angegeben werden, natürlich nur wenn es ausgewählt wurde.
Das ganze sollte per Bezeichner abgerufen werden können um es an System.Diagnostics.Process.Start(path + exe) als Startparameter anzugeben.
Ich würde es auch begrüßen wenn sich das ganze auch automatisch bei einer änderung in einer .ini speichert, sodass diese einstellungen dann beim erneuten Starten direkt vorgenommen werden.
Ein bisschen Ahnung habe ich ja, aber so kompliziert bekomme ich es nicht geregelt :( Ich besitze die Inifile (CfgFile) Klasse aus dem msdn archiv, würde aber auch XML akzeptieren.
Wäre wirklich nett wenn mir da jemand bei helfen könnte, bin auch bereit den Helfer im About zu verewigen.
Mfg
Andi
Kha - Fr 03.07.09 15:06
epinephrine87 hat folgendes geschrieben : |
Soo jetzt hätte ich da noch eine klitzekleine Frage: |
Sieht mir eher nach mindestens zwei verschiedenen Fragen aus ;) : Process.Start und Einstellungen sichern.
Erstelle bitte für jede deiner Fragen ein separates Topic, da die Diskussion mehrerer Fragen in einem Topic für gewöhnlich für Verwirrung und Durcheinander sorgt. Daher:
*geschlossen*
Viele Grüße,
Kha
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!