Zum Inhalt springen

c# Console - Datensicherung mit .csv Input (Quelle/Ziel)


D-Ani

Empfohlene Beiträge

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();

                }

            }        

    }

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :D

EDIT: Bezgl. Visual Basic das ist ein Überrest einer verworfenen Idee am Anfang. Das ganze war mal doppelt so lang :floet:

Bearbeitet von D-Ani
Link zu diesem Kommentar
Auf anderen Seiten teilen

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();

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :D ) 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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von D-Ani
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...