Veröffentlicht 20. Februar 200916 j Hallo liebe Fachinformatiker/innen erstmal ein liebes "Hallo" an alle. Nun meine Frage Ich soll ein Programm schreiben, was ein bestimmtes verzeichnis (samt unterverzeichnissen) durchsucht, und in einer liste die .xml dateien ausgibt. Nun habe ich schon angefangen, komme aber mit der funktion nicht weiter, wodran ich ja dann die durchsuchung der anderen verzeichnisse weitergeben muss. hier mein code: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); Text = "Dateien in C:\\Temp"; this.WindowState = FormWindowState.Normal; } private void button1_Click(object sender, EventArgs e) { DirectoryInfo dir = new DirectoryInfo(@"C:\Temp"); string[] directories = Directory.GetDirectories(@"C:\Temp"); FileInfo[] files = dir.GetFiles("*.xml"); string[]lines = new string[files.Length]; int i = 0; foreach (FileInfo file in files) { lines[i] = file.Name; i++; } textBox1.Lines = lines; } [B] private DirectoryInfo fkt(DirectoryInfo[] fkt2) { return null; }[/B] private void button2_Click(object sender, EventArgs e) { textBox1.ResetText(); } private void button3_Click(object sender, EventArgs e) { FileInfo file = new FileInfo(@"C:\Temp\export.txt"); StreamWriter writer = new StreamWriter(file.FullName); foreach (string line in textBox1.Lines) { writer.WriteLine(line); } writer.Flush(); writer.Close(); } } } kann mir da wer helfen? Mfg SeToY PS: return null; hab ich drinstehen, damit mir der compiler keinen fehler raushaut :e@sy
20. Februar 200916 j Autor Damit habe ich mich auch schon befasst, aber ich muss dazu sagen: Ich bin blutiger anfänger :old BTW: Danke für's verschieben... Habe mir scho ngedacht, dass ich da irgendwas falsch gemacht habe :upps
20. Februar 200916 j so zum Beispiel: List<string> SearchFiles(string path) { List<string> files = new List<string>(); DirectoryInfo dir = new DirectoryInfo(path); foreach (FileInfo file in dir.GetFiles("*.xml")) { files.Add(file.Name); } foreach (DirectoryInfo di in dir.GetDirectories()) { files.AddRange(SearchFiles(di.FullName)); } return files; }[/PHP]
20. Februar 200916 j private void GetFiles(string folderPath, List<string> fileList ) { if (!Directory.Exists(folderPath)) return; string[] dirs = Directory.GetDirectories(folderPath); foreach (string subDir in dirs) GetFiles(subDir, fileList); string[] files = Directory.GetFiles(folderPath, "*.xml"); foreach (string file in files) if (!fileList.Contains(file)) fileList.Add(file); } Guybrushs Lösung geht natürlich auch. :beagolisc
20. Februar 200916 j Autor Erstmal superlieben dank für eure Mühen aber wo sollte ich dieses codebeispiel jetzt einbauen? ich bin ja dabei die rekursive funktion "fkt" zu erstellen. im mom noch mit "return null;", damit ich beim compilen keinen fehler bekomme. müsste ich den code dann ziwschen die {} stellen? private DirectoryInfo fkt(DirectoryInfo[] fkt2) { return null; } also da, wo jetzt "return null;" steht, oder was müsste ich machen? danke SeToY Edit: Habe gerade mal den code umgebaut 'n bissle und nun das raus.. aber er gibt mir immer noch net die dateien in den unterverzeichnissen mit in die textbox1. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); Text = "Dateien in C:\\Temp"; this.WindowState = FormWindowState.Normal; } private void button1_Click(object sender, EventArgs e) { DirectoryInfo dir = new DirectoryInfo(@"C:\Temp"); string[] directories = Directory.GetDirectories(@"C:\Temp"); FileInfo[] files = dir.GetFiles("*.xml"); string[]lines = new string[files.Length]; int i = 0; foreach (FileInfo file in files) { lines[i] = file.Name; i++; } textBox1.Lines = lines; } private void GetFiles(string folderPath, List<string> fileList) { if (!Directory.Exists(folderPath)) return; string[] dirs = Directory.GetDirectories(folderPath); foreach (string subDir in dirs) GetFiles(subDir, fileList); string[] files = Directory.GetFiles(folderPath, "*.xml"); foreach (string file in files) if (!fileList.Contains(file)) fileList.Add(file); } private void button2_Click(object sender, EventArgs e) { textBox1.ResetText(); } private void button3_Click(object sender, EventArgs e) { FileInfo file = new FileInfo(@"C:\Temp\export.txt"); StreamWriter writer = new StreamWriter(file.FullName); foreach (string line in textBox1.Lines) { writer.WriteLine(line); } writer.Flush(); writer.Close(); } } } Bearbeitet 20. Februar 200916 j von SeToY
20. Februar 200916 j Autor Sry 4 doppelpost.. bin nun aber weiter :bimei ok, also ich hab nun die textbox in ne listbox geändert.. meine listbox heißt aber (damit ich nicht alles ummodeln muss) "textbox1". wie schaffe ich jetzt, dass ich die ausgewählte datei mit einem klick auf "öffnen" (button 4) öffnen kann? using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); Text = "Dateien in C:\\Temp"; this.WindowState = FormWindowState.Normal; } private void button1_Click(object sender, EventArgs e) { textBox1.Items.Clear(); List<string> files = this.GetFiles(@"C:\Temp", new List<string>()); string[] lines = new string[files.Count]; int i = 0; foreach (string file in files) { textBox1.Items.Add(file); i++; } } private List<string> GetFiles(string folderPath, List<string> fileList) { if (!Directory.Exists(folderPath)) return fileList; string[] dirs = Directory.GetDirectories(folderPath); foreach (string subDir in dirs) GetFiles(subDir, fileList); string[] files = Directory.GetFiles(folderPath, "*.xml"); foreach (string file in files) if (!fileList.Contains(file)) fileList.Add(file); return fileList; } private void button2_Click(object sender, EventArgs e) { textBox1.Items.Clear(); } private void button3_Click(object sender, EventArgs e) { FileInfo file = new FileInfo(@"C:\Temp\export.txt"); StreamWriter writer = new StreamWriter(file.FullName); foreach (string line in textBox1.Items) { writer.WriteLine(line); } writer.Flush(); writer.Close(); } private void button4_Click(object sender, EventArgs e) { // HIER MEIN ÖFFNEN-KNOPF } } } [/php] danke und mfg SeToY
23. Februar 200916 j wie schaffe ich jetzt, dass ich die ausgewählte datei mit einem klick auf "öffnen" (button 4) öffnen kann? Definiere öffnen. Externes Programm? Dieses Programm?
23. Februar 200916 j also ich vermute mal dür möchtest eine datei in der liste mit einem anderen programm öffnen. schau dir mal Process.Start an damit kannst du z.b. die datei über das std. programm öffnen. das ist dann vergleichbar mit einem doppelklick auf die datei(ganz grob).
24. Februar 200916 j Autor Also, habe nochmal drübergeschaut ^^ Ich soll die XML-Datei durchsuchen, einen wert finden, diesen ändern, und die datei wieder zurückspeichern. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Xml; namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); Text = "Dateien in C:\\Temp"; this.WindowState = FormWindowState.Normal; } private void button1_Click(object sender, EventArgs e) { textBox1.Items.Clear(); List<string> files = this.GetFiles(@"C:\Temp", new List<string>()); string[] lines = new string[files.Count]; int i = 0; foreach (string file in files) { textBox1.Items.Add(file); i++; } } private List<string> GetFiles(string folderPath, List<string> fileList) { if (!Directory.Exists(folderPath)) return fileList; string[] dirs = Directory.GetDirectories(folderPath); foreach (string subDir in dirs) GetFiles(subDir, fileList); string[] files = Directory.GetFiles(folderPath, "*.xml"); foreach (string file in files) if (!fileList.Contains(file)) fileList.Add(file); return fileList; } private void button2_Click(object sender, EventArgs e) { textBox1.Items.Clear(); } private void button3_Click(object sender, EventArgs e) { FileInfo file = new FileInfo(@"C:\Temp\export.txt"); StreamWriter writer = new StreamWriter(file.FullName); foreach (string line in textBox1.Items) { writer.WriteLine(line); } writer.Flush(); writer.Close(); } private void button4_Click(object sender, EventArgs e) { StreamReader reader = new StreamReader(textBox1.SelectedItem.ToString()); XmlDocument doc = new XmlDocument(); } } } [/php] Bearbeitet 24. Februar 200916 j von SeToY
24. Februar 200916 j Schau dir mal die XmlDocument-Klasse an. [Edit] Ok, warst schneller. http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.load.aspx
24. Februar 200916 j Autor Ooooookay using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Xml; namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); Text = "Dateien in C:\\Temp"; this.WindowState = FormWindowState.Normal; } private void button1_Click(object sender, EventArgs e) { textBox1.Items.Clear(); List<string> files = this.GetFiles(@"C:\Temp", new List<string>()); string[] lines = new string[files.Count]; int i = 0; foreach (string file in files) { textBox1.Items.Add(file); i++; } } private List<string> GetFiles(string folderPath, List<string> fileList) { if (!Directory.Exists(folderPath)) return fileList; string[] dirs = Directory.GetDirectories(folderPath); foreach (string subDir in dirs) GetFiles(subDir, fileList); string[] files = Directory.GetFiles(folderPath, "*.*"); foreach (string file in files) if (!fileList.Contains(file)) fileList.Add(file); return fileList; } private void button2_Click(object sender, EventArgs e) { textBox1.Items.Clear(); } private void button3_Click(object sender, EventArgs e) { FileInfo file = new FileInfo(@"C:\Temp\export.txt"); StreamWriter writer = new StreamWriter(file.FullName); foreach (string line in textBox1.Items) { writer.WriteLine(line); } writer.Flush(); writer.Close(); } private void button4_Click(object sender, EventArgs e) { StreamReader reader = new StreamReader(textBox1.SelectedItem.ToString()); XmlDocument doc = new XmlDocument(); doc.LoadXml(reader.ReadToEnd()); XmlReader read = new XmlReader(); } } } [/php] das hab ich nun ^^ in der xml steht: [code] <add name="Debug" /> [/code] , welches ich durch [code] <add name="xxx" /> [/code] ersetzen soll. danach wieder zurückspeichern.
24. Februar 200916 j hmm, ungetestet: string file = textBox1.SelectedItem.ToString(); XmlDocument doc = new XmlDocument(file); doc["add"].Attributes["name"].Value = "xxx"; doc.Save(file);
24. Februar 200916 j Autor funktioniert nicht. das problem ist ja, dass ich vorher die dateien auslese, welche alle in dem verzeichnis vorhanden sind. also kann ich keine feste datei-url vergeben. so bin ich weitergegangen: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Xml; namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); Text = "Dateien in C:\\Temp"; this.WindowState = FormWindowState.Normal; } private void button1_Click(object sender, EventArgs e) { textBox1.Items.Clear(); List<string> files = this.GetFiles(@"C:\Temp", new List<string>()); string[] lines = new string[files.Count]; int i = 0; foreach (string file in files) { textBox1.Items.Add(file); i++; } } private List<string> GetFiles(string folderPath, List<string> fileList) { if (!Directory.Exists(folderPath)) return fileList; string[] dirs = Directory.GetDirectories(folderPath); foreach (string subDir in dirs) GetFiles(subDir, fileList); string[] files = Directory.GetFiles(folderPath, "*.*"); foreach (string file in files) if (!fileList.Contains(file)) fileList.Add(file); return fileList; } private void button2_Click(object sender, EventArgs e) { textBox1.Items.Clear(); } private void button3_Click(object sender, EventArgs e) { FileInfo file = new FileInfo(@"C:\Temp\export.txt"); StreamWriter writer = new StreamWriter(file.FullName); foreach (string line in textBox1.Items) { writer.WriteLine(line); } writer.Flush(); writer.Close(); } private void button4_Click(object sender, EventArgs e) { StreamReader reader = new StreamReader(textBox1.SelectedItem.ToString()); XmlDocument doc = new XmlDocument(); doc.LoadXml(reader.ReadToEnd()); XmlNodeList nodelist = doc.GetElementsByTagName("categoryFilters"); } } } [/php].
24. Februar 200916 j funktioniert nicht. das problem ist ja, dass ich vorher die dateien auslese, welche alle in dem verzeichnis vorhanden sind. also kann ich keine feste datei-url vergeben. Die URL (der Pfad zur Datei) steht doch in textBox1.SelectedItem?! :confused:
24. Februar 200916 j Autor jo, recht haste.. xD ich setz deinen code nochmal eben ein. edit: Debugger: The Name 'file' does not exist in the current context.
24. Februar 200916 j Autor ja ne eigentlich nicht.. ^^ hab jetzt auch weitergemacht: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Xml; namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); Text = "Dateien in C:\\Temp"; this.WindowState = FormWindowState.Normal; } private void button1_Click(object sender, EventArgs e) { textBox1.Items.Clear(); List<string> files = this.GetFiles(@"C:\Temp", new List<string>()); string[] lines = new string[files.Count]; int i = 0; foreach (string file in files) { textBox1.Items.Add(file); i++; } } private List<string> GetFiles(string folderPath, List<string> fileList) { if (!Directory.Exists(folderPath)) return fileList; string[] dirs = Directory.GetDirectories(folderPath); foreach (string subDir in dirs) GetFiles(subDir, fileList); string[] files = Directory.GetFiles(folderPath, "*.config"); foreach (string file in files) if (!fileList.Contains(file)) fileList.Add(file); return fileList; } private void button2_Click(object sender, EventArgs e) { textBox1.Items.Clear(); } private void button3_Click(object sender, EventArgs e) { FileInfo file = new FileInfo(@"C:\Temp\export.txt"); StreamWriter writer = new StreamWriter(file.FullName); foreach (string line in textBox1.Items) { writer.WriteLine(line); } writer.Flush(); writer.Close(); } private void button4_Click(object sender, EventArgs e) { StreamReader reader = new StreamReader(textBox1.SelectedItem.ToString()); string file = textBox1.SelectedItem.ToString(); XmlDocument doc = new XmlDocument(); doc.LoadXml(reader.ReadToEnd()); reader.Close(); XmlNodeList nodelist = doc.GetElementsByTagName("categoryFilters"); string nodeXml = nodelist[0].InnerXml; XmlNodeList childs = nodelist[0].ChildNodes; childs[0].Attributes["name"].Value = "xxx"; StreamWriter writer = new StreamWriter(file+".new.config"); string[] xml = doc.InnerXml.Split('>'); writer.WriteLine(xml[0]+">"); writer.Flush(); writer.Close(); } } } [/php] jetzt gibt er mir aber nur die erste zeile aus meinem xml-document aus :S
24. Februar 200916 j ja ne eigentlich nicht.. ^^ hab jetzt auch weitergemacht: //... private void button4_Click(object sender, EventArgs e) { StreamReader reader = new StreamReader(textBox1.SelectedItem.ToString()); string file = textBox1.SelectedItem.ToString(); XmlDocument doc = new XmlDocument(); doc.LoadXml(reader.ReadToEnd()); reader.Close(); XmlNodeList nodelist = doc.GetElementsByTagName("categoryFilters"); string nodeXml = nodelist[0].InnerXml; XmlNodeList childs = nodelist[0].ChildNodes; childs[0].Attributes["name"].Value = "xxx"; StreamWriter writer = new StreamWriter(file+".new.config"); string[] xml = doc.InnerXml.Split('>'); writer.WriteLine(xml[[B]0[/B]]+">"); writer.Flush(); writer.Close(); } } } [/php] jetzt gibt er mir aber nur die erste zeile aus meinem xml-document aus :S Ist auch klar wenn du splittest. "<node1 value="1"> <node2 value="2">" Wird dann zu {[b] "<node1 value=\"1\""[/b], "<node2 value=\"2\""}
24. Februar 200916 j Autor jetz muss ich schon wieder double-posten, weil ich meinen post net editieren kann :upps naja.. bin soweit, dass er das dingen jetzt ändert. aber nur, wenn es sich an der angegebenen stelle befindet. wie schaff ich es jetzt, dass er das "debug" ändert, auch wenn es nich da is, wo es eigentlich ist? using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Xml; namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); Text = "Dateien in C:\\Temp"; this.WindowState = FormWindowState.Normal; } private void button1_Click(object sender, EventArgs e) { textBox1.Items.Clear(); List<string> files = this.GetFiles(@"C:\Temp", new List<string>()); string[] lines = new string[files.Count]; int i = 0; foreach (string file in files) { textBox1.Items.Add(file); i++; } } private List<string> GetFiles(string folderPath, List<string> fileList) { if (!Directory.Exists(folderPath)) return fileList; string[] dirs = Directory.GetDirectories(folderPath); foreach (string subDir in dirs) GetFiles(subDir, fileList); string[] files = Directory.GetFiles(folderPath, "*.config"); foreach (string file in files) if (!fileList.Contains(file)) fileList.Add(file); return fileList; } private void button2_Click(object sender, EventArgs e) { textBox1.Items.Clear(); } private void button3_Click(object sender, EventArgs e) { FileInfo file = new FileInfo(@"C:\Temp\export.txt"); StreamWriter writer = new StreamWriter(file.FullName); foreach (string line in textBox1.Items) { writer.WriteLine(line); } writer.Flush(); writer.Close(); } private void button4_Click(object sender, EventArgs e) { StreamReader reader = new StreamReader(textBox1.SelectedItem.ToString()); string file = textBox1.SelectedItem.ToString(); XmlDocument doc = new XmlDocument(); doc.LoadXml(reader.ReadToEnd()); reader.Close(); XmlNodeList nodelist = doc.GetElementsByTagName("categoryFilters"); string nodeXml = nodelist[0].InnerXml; XmlNodeList childs = nodelist[0].ChildNodes; childs[0].Attributes["name"].Value = "xxx"; StreamWriter writer = new StreamWriter(file+".new.config"); string[] xml = doc.InnerXml.Split('>'); //writer.WriteLine(xml[0] + ">"); foreach (string sfda in xml) { writer.WriteLine(sfda + ">"); } writer.Flush(); writer.Close(); } } } [/php] danke schonmal
25. Februar 200916 j He also erst mal eine frage welche .Net version setzt du ein? weil das StreamReader reader = new StreamReader(textBox1.SelectedItem.ToString()); string file = textBox1.SelectedItem.ToString(); XmlDocument doc = new XmlDocument(); doc.LoadXml(reader.ReadToEnd()); [/PHP] geht auch einfacher ist aber von der .Net version abhängig [PHP] doc.Load(textBox1.SelectedItem.ToString()); achja und wenn du nur einen bestimmten text ersetzen sollst warum liest du dann das ganze xml ein? ... string temp = reader.ReadToEnd(); temp= temp.Replace("alterwert", "neuerWert"); ... [/PHP] geht eventuel einfacher... alternativ kannst du auch mit [PHP] doc.SelectNodes("//add[@name='debug']") eine Nodelist erzeugen die du dann in einer schleife abarbeiten kannst. ist evenetuel sogar der einfachste weg. grüße wolf Bearbeitet 25. Februar 200916 j von U[[ °LoneWolf° ergänzung
26. Februar 200916 j Autor benutze .net 2005. Visual studio. jetzt hab ich den code so gut wie fertig und hab ne neue aufgabe beim klick auf den knopf "ändern" soll die komplette zeile mit dem kompletten tag gelöscht werden. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Xml; namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); Text = "Dateien in C:\\Temp"; this.WindowState = FormWindowState.Normal; } private void button1_Click(object sender, EventArgs e) { textBox1.Items.Clear(); List<string> files = this.GetFiles(@"C:\Temp", new List<string>()); string[] lines = new string[files.Count]; int i = 0; foreach (string file in files) { textBox1.Items.Add(file); i++; } } private List<string> GetFiles(string folderPath, List<string> fileList) { if (!Directory.Exists(folderPath)) return fileList; string[] dirs = Directory.GetDirectories(folderPath); foreach (string subDir in dirs) GetFiles(subDir, fileList); string[] files = Directory.GetFiles(folderPath, "*.config"); foreach (string file in files) if (!fileList.Contains(file)) fileList.Add(file); return fileList; } private void button2_Click(object sender, EventArgs e) { textBox1.Items.Clear(); } private void button3_Click(object sender, EventArgs e) { FileInfo file = new FileInfo(@"C:\Temp\export.txt"); StreamWriter writer = new StreamWriter(file.FullName); foreach (string line in textBox1.Items) { writer.WriteLine(line); } writer.Flush(); writer.Close(); } private void button4_Click(object sender, EventArgs e) { StreamReader reader = new StreamReader(textBox1.SelectedItem.ToString()); string file = textBox1.SelectedItem.ToString(); XmlDocument doc = new XmlDocument(); doc.LoadXml(reader.ReadToEnd()); reader.Close(); XmlNodeList nodelist = doc.SelectNodes("/configuration/loggingConfiguration/logFilters/add/categoryFilters/add"); foreach (XmlNode node in nodelist) { if (node.Attributes["name"].Value.ToLower() == "debug") { node.Attributes["name"].Value = "xxx"; } } StreamWriter writer = new StreamWriter(file+".new.config"); string[] xml = doc.InnerXml.Split('>'); //writer.WriteLine(xml[0] + ">"); foreach (string sfda in xml) { writer.WriteLine(sfda + ">"); } writer.Flush(); writer.Close(); } } } [/php] hier die zeile: [php] <categoryFilters> <add name="Info" /> <add name="Warning" /> <add name="Error" /> <add name="Debug" /> <add name="Fatal" /> </categoryFilters>
26. Februar 200916 j schau dir doch Mal an was ein einzelnes XmlNode alles kann bzw. was ein XmlDocument so kann. Da findest du bestimmt einene eintrag wie delete oder remove ...
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.