D-Ani Geschrieben 4. Juli 2013 Teilen Geschrieben 4. Juli 2013 Guten Morgen, ich habe bisweilen nur mit php gearbeitet und soll nun mit c# ein Tool erstellen das gefüttert wird mit einer .txt Datei in der pro Zeile Source/Target (Quelle/Ziel) der Datensicherung steht. Also wenn c:\test nach e:\saveme soll z.b. und natürlich muss das mit mehreren gehen (Seperator ist Semikolon). Ich habe schon an eine for Schleife gedacht zum Spalten/Listen weise abarbeiten, aber irgendwie hänge ich fest. Das Script funktioniert soweit einwandfrei wenn es nur ein Pfad und eine Quelle gibt. Und Fehler werden auch abgefangen. Jemand eine Idee? using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.VisualBasic; using System.Diagnostics; namespace ConsoleApplication3 { class Program { private static FileAttributes Normal; private static DateTime time; static void Main(string[] args) { // Angabe Ziel und Quellverzeichnis (nachher Mehrere Quellen) string source = @"C:\test"; string target = @"E:\SaveMe"; string eLogD = @"C:\ErrorLog.txt"; // Zeitstempel DateTime today = DateTime.Now; // Angaben und Erfolgsausgabe(n) string waitfile = ("Bitte warten... Die Sicherung der Dateien von "); string waitfileb = (" nach "); string waitfilec = (" wird aktuell erstellt!"); string waitpath = ("Bitte warten... Die Sicherung der Verzeichnisse "); string waitpathb = (" nach "); string waitpathc = (" wird aktuell erstellt!"); string succ = ("Die Sicherung der Dateien war Erfolgreich.\n"); string taste = ("Taste betätigen für Exit!"); // Fehlerausgabe(n) string dne = (DateTime.Now + " Das angegebene Verzeichnis (" + source + ") existiert nicht!\n"); string zws = (DateTime.Now + " Es ist nicht genug Speicher vorhanden damit die Datei vollständig gelesen werden kann!\n"); string dwng = (DateTime.Now + " Die Datei(en) wurde(n) nicht gefunden!\n"); string kzgb = (DateTime.Now + " Keine Zugriffsberechtigung im Zielordner (" + target + ")! Entfernen Sie den Schreib- und/oder Leseschutz der zu überschreibenden Datei oder benennen Sie die Datei um!\n"); string sf = (DateTime.Now + " Ein nicht bedachter Fehler ist aufgetreten...!\n"); string up = (DateTime.Now + " Das Format des angegebenen Pfades ist Ungültig!\n"); string dpizl = (DateTime.Now + " Der eingetragene Pfad oder Dateiname ist zu lang.\nAuf Windows-Plattformen dürfen Pfade nicht länger als 247 Zeichen und Dateinamen nicht länger als 259 Zeichen sein.\n"); // Wertausgabe int pathLen = source.Length + 1; // Abfrage ob (Quell)Verzeichnis existiert, dass gesichert werden soll... if (Directory.Exists(source)) { try { DirectoryInfo ParentDirectory = new DirectoryInfo(source); // Suchen, Kombinieren und Überschreiben der Pfade foreach (string d in Directory.GetDirectories(source, "*", SearchOption.AllDirectories)) { string subPath = d.Substring(pathLen); string newpath = Path.Combine(target, subPath); Directory.CreateDirectory(newpath); // Bitte Warten Ausgabe Console.WriteLine(waitpath + d + waitpathb + newpath + waitpathc); } // Suchen, Kombinieren und Überschreiben der Dateien mit den Pfaden foreach (string f in Directory.GetFiles(source, "*", SearchOption.AllDirectories)) { string subPath = f.Substring(pathLen); string newpath = Path.Combine(target, subPath); File.Copy(f, newpath, true); File.SetAttributes(newpath, FileAttributes.Normal); // Bitte Warten Ausgabe Console.WriteLine(waitfile + f + waitfileb + newpath + waitfilec); } // Sicherung Erfolgreich Ausgabe Console.WriteLine(succ + taste); Console.ReadLine(); } catch (OutOfMemoryException) { File.AppendAllText(eLogD, zws); Console.WriteLine(zws + taste); Console.ReadLine(); } catch (FileNotFoundException) { File.AppendAllText(eLogD, dwng); Console.WriteLine(dwng + taste); Console.ReadLine(); } catch (UnauthorizedAccessException) { File.AppendAllText(eLogD, kzgb); Console.WriteLine(kzgb + taste); Console.ReadLine(); } catch (NotSupportedException) { File.AppendAllText(eLogD, up); Console.WriteLine(up + taste); Console.ReadLine(); } catch (PathTooLongException) { File.AppendAllText(eLogD, dpizl); Console.WriteLine(dpizl + taste); Console.ReadLine(); } catch (Exception) { File.AppendAllText(eLogD, sf); Console.WriteLine(sf + taste); Console.ReadLine(); } } // Wenn Quellverzeichnis nicht existiert... else { // Fehlerausgabe Quellverzeichnis existiert nicht... File.AppendAllText(eLogD, dne); Console.WriteLine(dne + taste); Console.ReadLine(); } } } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SilentDemise Geschrieben 4. Juli 2013 Teilen Geschrieben 4. Juli 2013 Ich verstehe dein Problem nicht ganz.. du hast Schwierigkeiten das txt file einzulesen? Darüber zu iterieren? Ich empfehle zum iterieren über csv dateien LINQ in kombination mit einem StreamReader Generell solltest du nicht dein ganzes Program in eine Klasse stecken, das wirkt sehr unübersichtlich ;-) Warum referenzierst du in einem C# Programm VisualBasic? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
D-Ani Geschrieben 4. Juli 2013 Autor Teilen Geschrieben 4. Juli 2013 (bearbeitet) Ich hab das Problem mit c# kaum Erfahrung zu haben und das meiste aus php "übernommen" zu haben. Allerdings tue ich mich bei string[] z.b. schwer das als Quelle mag der restliche Code nicht. Dann sagt es mir bezgl. ungültiger Argumente. Das mit Streamreader und LINQ habe ich gelesen, aber wer nicht klug daraus. Eine einfache .txt Datei einlesen kann ich. Schlussendlich schreib ich ja mit der Anwendung ein Error Log in eine .txt. Mir erschließt sich nur nicht Gedanklich wie ich das ganze so einbauen kann das ich z.b. Datei: zeile1>source;target; zeile2>source;target; usw... jeweils habe für meine foreach Schleifen wo die Sicherungsarbeiten vorgenommen werden. Ich müsste ja die Werte oben und in die Schleife übergeben können. Da dort Zielpfad zusammengebaut wird. Vielleicht denk ich auch gerade zu Umständlich keine Ahnung, aber ich steh wie ein Elefant auf dem Schlauch EDIT: Bezgl. Visual Basic das ist ein Überrest einer verworfenen Idee am Anfang. Das ganze war mal doppelt so lang :floet: Bearbeitet 4. Juli 2013 von D-Ani Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ein Bob Geschrieben 4. Juli 2013 Teilen Geschrieben 4. Juli 2013 Eine kleine Hilfestellung ohne Anspruch auf Korrektheit (bin mehr so Java-Typie) // Der Dateiname der Liste der Quellen und Ziele ist erster Parameter static void Main(string[] args) { Streamreader reader = new Streamreader(args[0]); while((zeile = reader.ReadLine()) != null) { string[] felder = zeile.Split(';'); string source = felder[0]; string target = felder[1]; [...] // Dein Programm } reader.close(); } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
D-Ani Geschrieben 4. Juli 2013 Autor Teilen Geschrieben 4. Juli 2013 Ja an die While/For Schleife dachte ich schon... hier eins meiner "Versuche" try { StreamReader sr = new StreamReader(source); string inputLine = (""); int i = 0; while ((inputLine = sr.ReadLine()) != null) { i++; values = inputLine.Split(new Char[] { ';' }); for (int j = 0; j < values.Length; j++) { string ez = values[j]; } DirectoryInfo ParentDirectory = new DirectoryInfo(source); // Suchen, Kombinieren und Überschreiben der Pfade foreach (string d in Directory.GetDirectories(source, "*", SearchOption.AllDirectories)) { string subPath = d.Substring(pathLen); string newpath = Path.Combine(target, subPath); Directory.CreateDirectory(newpath); // Bitte Warten Ausgabe Console.WriteLine(waitpath + d + waitpathb + newpath + waitpathc); } // Suchen, Kombinieren und Überschreiben der Dateien mit den Pfaden foreach (string f in Directory.GetFiles(source, "*", SearchOption.AllDirectories)) { string subPath = f.Substring(pathLen); string newpath = Path.Combine(target, subPath); File.Copy(f, newpath, true); File.SetAttributes(newpath, FileAttributes.Normal); // Bitte Warten Ausgabe Console.WriteLine(waitfile + f + waitfileb + newpath + waitfilec); } // Sicherung Erfolgreich Ausgabe Console.WriteLine(succ + taste); Console.ReadLine(); } } Ich hab ja 0 und 1 mit jeweils c und e, aber wie baue ich weiter auf. Ich mein da kommt eine weitere Schleife in die Schleife der schleifen... Schlussendlich weiß ich nicht was Du oder dein Nachbar im Endeffekt alles als Quelle und Ziele die man sichern soll eingeben. Oder lassen sich die Schleifen miteinander verschachteln das ich mir Code sparen kann... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
D-Ani Geschrieben 4. Juli 2013 Autor Teilen Geschrieben 4. Juli 2013 Leider kann ich jetzt nicht mehr editieren, aber was mir einfällt. Selbst wenn ich zähle könnte ich ja für Source nur ungerade und für Ziele nur gerade Werte nehmen. Von Spalten habe ich gelesen ist mir aber unbekannt soweit. Wäre das eine Alternative? Scheint mit im Moment (was nicht viel heißen soll ) das Sinnvollere zu sein das Spaltenweise zu machen (wenn es weniger Code braucht wie ich denke) als ein großes Konstrukt aus 200tsd Schleifen für Schleifen zu bauen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ein Bob Geschrieben 4. Juli 2013 Teilen Geschrieben 4. Juli 2013 Ich verstehe nicht, was du erreichen willst. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
D-Ani Geschrieben 4. Juli 2013 Autor Teilen Geschrieben 4. Juli 2013 Im Endeffekt Einlesen einer Datei die Ursprung - Ziel beinhaltet Übergabe der Werte in die jeweilige Schleife (Pfad / Datei) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ein Bob Geschrieben 4. Juli 2013 Teilen Geschrieben 4. Juli 2013 Übergabe der Werte in die jeweilige Schleife (Pfad / Datei)Nehmen wir mal an, ich würde das nicht verstehen .... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Nookz Geschrieben 4. Juli 2013 Teilen Geschrieben 4. Juli 2013 Die Datei sieht so aus oder? zeile1: source;target; zeile2: source;target; ... usw. Würde dann einfach, sofern ich dich richtig verstehe, einen StreamReader benutzen(etwa so): String path = @"C:\blub.txt"; //dein Dateipfad String line; StreamReader sr = new StreamReader(path); while((line = sr.ReadLine() != null) { string source = line.Remove(line.IndexOf(";")); string target = line.Substring(line.IndexOf(";") + 1, line.LastIndexOf(";") -1); // vielleicht auch ohne +1/-1, bin mir bei substr immer unsicher //------- deine 2 foreach-schleifen -------- ... //------------------------------------------ }[/code] Funktioniert aber nur wenn deine Datei auch so aussieht, dass du pro Zeile jeweils nur "source;target;" hast. Bin mir allerdings auch nicht sicher ob ich das, was du versuchst, richtig verstanden habe. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
D-Ani Geschrieben 5. Juli 2013 Autor Teilen Geschrieben 5. Juli 2013 (bearbeitet) Also ich habe es noch hin bekommen mit der Idee von Euch :-) Allerdings musste ich gehörig umbauen damit alles so Verfügbar bleibt wie gewünscht. Hier ein vorläufiger Code using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.VisualBasic; using System.Diagnostics; namespace ConsoleApplication3 { class Program { private static FileAttributes Normal; private static DateTime time; private static string[] values; static void Main(string[] args) { // Angabe Ziel und Quellverzeichnis (nachher Mehrere Quellen) string source = @"C:\config.txt"; string eLogD = @"C:\ErrorLog.txt"; // Zeitstempel DateTime today = DateTime.Now; // Angaben und Erfolgsausgabe(n) string waitfile = ("Bitte warten... Die Sicherung der Dateien von "); string waitfileb = (" nach "); string waitfilec = (" wird aktuell erstellt!"); string waitpath = ("Bitte warten... Die Sicherung der Verzeichnisse "); string waitpathb = (" nach "); string waitpathc = (" wird aktuell erstellt!"); string succ = ("Die Sicherung der Dateien war Erfolgreich.\n"); string taste = ("Weiter mit beliebiger Taste"); // Fehlerausgabe(n) string cd = (DateTime.Now + " Die Configdatei (" + source + ") existiert nicht!\n"); // Abfrage ob Configdatei existiert... if (File.Exists(source)) { StreamReader sr = new StreamReader(source); string inputLine = (""); int i = 0; while ((inputLine = sr.ReadLine()) != null) { i++; values = inputLine.Split(new Char[] { ';' }); for (int j = 0; j < values.Length; j++) { string ez = values[j]; } string csvsource = values[0]; string csvtarget = values[1]; DirectoryInfo ParentDirectory = new DirectoryInfo(csvsource); string dne = (DateTime.Now + " Das angegebene Verzeichnis (" + csvsource + ") existiert nicht!\n"); string zws = (DateTime.Now + " Es ist nicht genug Speicher vorhanden damit die Datei vollständig gelesen werden kann!\n"); string dwng = (DateTime.Now + " Die Datei(en) wurde(n) nicht gefunden!\n"); string kzgb = (DateTime.Now + " Keine Zugriffsberechtigung im Zielordner (" + csvtarget + ")! Entfernen Sie den Schreib- und/oder Leseschutz der zu überschreibenden Datei oder benennen Sie die Datei um!\n"); string sf = (DateTime.Now + " Ein nicht bedachter Fehler ist aufgetreten...!\n"); string up = (DateTime.Now + " Das Format des angegebenen Pfades ist Ungültig!\n"); string dpizl = (DateTime.Now + " Der eingetragene Pfad oder Dateiname ist zu lang.\nAuf Windows-Plattformen dürfen Pfade nicht länger als 247 Zeichen und Dateinamen nicht länger als 259 Zeichen sein.\n"); try { // Wertausgabe int pathLen = csvsource.Length + 1; // Suchen, Kombinieren und Überschreiben der Pfade foreach (string d in Directory.GetDirectories(csvsource, "*", SearchOption.AllDirectories)) { string subPath = d.Substring(pathLen); string newpath = Path.Combine(csvtarget, subPath); Directory.CreateDirectory(newpath); // Bitte Warten Ausgabe Console.WriteLine(waitpath + d + waitpathb + newpath + waitpathc); } // Suchen, Kombinieren und Überschreiben der Dateien mit den Pfaden foreach (string f in Directory.GetFiles(csvsource, "*", SearchOption.AllDirectories)) { string subPath = f.Substring(pathLen); string newpath = Path.Combine(csvtarget, subPath); File.Copy(f, newpath, false); File.SetAttributes(newpath, FileAttributes.Normal); // Bitte Warten Ausgabe Console.WriteLine(waitfile + f + waitfileb + newpath + waitfilec); } // Sicherung Erfolgreich Ausgabe Console.WriteLine(succ + taste); Console.ReadLine(); } catch (OutOfMemoryException) { // Fehlerausgabe Zu wenig Speicher... File.AppendAllText(eLogD, zws); Console.WriteLine(zws + taste); Console.ReadLine(); } catch (FileNotFoundException) { // Fehlerausgabe Datei existiert nicht... File.AppendAllText(eLogD, dwng); Console.WriteLine(dwng + taste); Console.ReadLine(); } catch (UnauthorizedAccessException) { // Fehlerausgabe Zugriffsrechte auf das Zielverzeichnis unzureichend... File.AppendAllText(eLogD, kzgb); Console.WriteLine(kzgb + taste); Console.ReadLine(); } catch (NotSupportedException) { // Fehlerausgabe Methode wird nicht unterstützt... File.AppendAllText(eLogD, up); Console.WriteLine(up + taste); Console.ReadLine(); } catch (PathTooLongException) { // Fehlerausgabe angegebener Pfad ist zu lang... File.AppendAllText(eLogD, dpizl); Console.WriteLine(dpizl + taste); Console.ReadLine(); } catch (DirectoryNotFoundException) { // Fehlerausgabe Quellverzeichnis existiert nicht... File.AppendAllText(eLogD, dne); Console.WriteLine(dne + taste); Console.ReadLine(); } catch (Exception) { // Fehlerausgabe sonstige Fehler... File.AppendAllText(eLogD, sf); Console.WriteLine(sf + taste); Console.ReadLine(); } } } else { // Fehlerausgabe Configdatei existiert nicht... File.AppendAllText(eLogD, cd); Console.WriteLine(cd + taste); Console.ReadLine(); } } } } Allerdings habe ich festgestellt das es mir keine Verzeichnisse nimmt die kein Unterverzeichnis haben :confused: Er bricht ab mit der Meldung DirectoryNotFoundException ... Die .txt sieht so aus c:\Adobe;e:\SaveMe c:\Microsoft;e:\SaveMe2 c:\Oracle;e:\SaveMe3 c:\SAP;e:\SaveMe4 Bearbeitet 5. Juli 2013 von D-Ani Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.