myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Knowledge Base » Artikel » [Tutorial] Dateioperationen: Alles über Dateien
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

[Tutorial] Dateioperationen: Alles über Dateien

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
SimonKnight6600 SimonKnight6600 ist männlich
myCSharp.de-Mitglied

avatar-1433.gif


Dabei seit: 09.03.2005
Beiträge: 709
Entwicklungsumgebung: Microsoft Visual Studio 2008
Herkunft: Österreich


SimonKnight6600 ist offline

[Tutorial] Dateioperationen: Alles über Dateien

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

WICHTIG: Tutorial ist veraltet. Neue Version:  [Tutorial] Alles über Dateien 2.2

Ich bitte um Kommentare, wie das Tutorial euch gefällt. (Ist mein erstes Tutorial)
So, aber nun zum eigentlichen Tutorial.

Ich möchte hier mal ein kleines Tutorial über das Arbeiten mit Dateien schreiben. Es geht um,
Wenn das Tutorial gut ankommt, werden vieleicht noch weitere Punkte hinzukommen.

Kapitel 1: Datei lesen und schreiben

Für folgende Beispiele ist es notwenig, dass die Library System.Windows.Forms referenziert ist und die Namenräume System.IO und System.Windows.Forms importiert werden.

Abschnitt 1.1: Dateien schreiben
Für das Lesen und Schreiben von Dateien stellt das .net Framwork ein paar nützliche Klassen im Namensraum System.IO bereit. Die, wie ich finde für Anfänger am besten geeignete Klasse zum Arbeiten mit Dateien ist die Klasse System.IO.File. Ich werde diese Klasse hier mal kurz vorstellen.

Das folgende Programm zeigt, wie man eine Datei erzeugen und gleich etwas reinschreiben kann. Als Beispiel nehme ich jetzt mal eine Telefonliste her.
Die Namen und Telefonnummer werden durch einen Strichpunkt( ; ) getrennt.

C#-Code:
using System;
using System.IO;
using System.Windows.Forms;
namespace tigerclaw_software_tutorial
{
    class Start
    {
        [STAThread]
        static void Main(string[] args)
        {
            SaveTelefonNumbers();
            Console.WriteLine("Programmende");
            Console.ReadLine();
        }
        private static void SaveTelefonNumbers()
        {
            StreamWriter writer = File.CreateText(Application.StartupPath + "\\telefonnummern.txt"); // Datei erzeugen
            writer.WriteLine("Thomas;223245"); // Ein paar Eintrge hineinschreiben
            writer.WriteLine("Matze;22741");
            writer.WriteLine("Michael;357228");
            writer.WriteLine("Richard;242531");
            writer.WriteLine("Dominik;242352");

            writer.Close(); // Den Dateizugriff beenden
        }


    }
}

Der Inhalt der Datei telefonnummern.txt sollte nach der Ausführung des Programms so aussehen:

Zitat:
Thomas;223245
Matze;22741
Michael;357228
Richard;242531
Dominik;242352

Die Namen und Telefonnummer habe ich mir natürlich nur ausgedacht ;D.
Wichtig: Immer nach dem Schreiben den writer schließen! (mit writer.Close() ) Ansonsten wird der Ausgabebuffer nicht entleert und es kann passieren, dass der vermeintlich geschriebene Text nicht in der Datei gespeichert wurde.

Abschnitt 1.2: Datei einlesen

Im Namensraum System.IO.File gibt es, wie bereits erwähnt auch Methoden zum Lesen von Dateien. Ich werde das vorherige Beispiel mit der Telefonliste um eine Methode erweitern, die die Namen und Telefonnummern aus der Datei wieder einliest. Dabei benutze ich die Methode String.Split() um die Namen von den Telefonnummern zu trennen.

Der gesamte Programmcode: (Einschließlich der Code aus dem ersten Beispiel)

C#-Code:
using System;
using System.IO;
using System.Windows.Forms;
namespace tigerclaw_software_tutorial
{
    class Start
    {
        [STAThread]
        static void Main(string[] args)
        {
            new Start();
        }
        public Start()
        {
            SaveTelefonNumbers();
            ReadTelefonNumbers();
            Console.WriteLine("Programmende");
            Console.ReadLine();

        }
        private void SaveTelefonNumbers()
        {
            StreamWriter writer = File.CreateText(Application.StartupPath + "\\telefonnummern.txt"); // Datei erzeugen
            writer.WriteLine("Thomas;223245"); // Ein paar Eintrge hineinschreiben
            writer.WriteLine("Matze;22741");
            writer.WriteLine("Michael;357228");
            writer.WriteLine("Richard;242531");
            writer.WriteLine("Dominik;242352");

            writer.Close(); // Den Dateizugriff beenden
        }

        private void ReadTelefonNumbers()
        {
            try
            {
                string[] zeile; // Ein Array für die Methode String.Split erstellen
                string name, nummer;

                StreamReader reader = File.OpenText(Application.StartupPath + "\\telefonnummern.txt"); // Datei öffnen
                for (int i = 0; -1 != reader.Peek(); i++) // Wenn Peek -1 zurückgibt ist die Datei fertiggelesen
                {
                    zeile = reader.ReadLine().Split(';');
                    name = zeile[0];
                    nummer = zeile[1];
                    Console.WriteLine("Name: {0} Telefonnummer: {1}", name, nummer);
                }
                reader.Close();




            }
            catch (FileNotFoundException exc) // Falls die Datei nicht gefunden wurde
            {
                Console.WriteLine("Die Datei telefonnummern.txt wurde nicht gefunden!");
                Console.WriteLine(exc.Message);
            }

        }

    }
}

Erklärung: Zuerst deklarieren wir die Variablen, die wir dann zum Einlesen und Ausgeben der Telefonnummmern brauchen. Das Stringarray zeile brauchen wir, um die eingelesen zeilen beim ; zu trennen. Nun machen wir eine for schleifen, die solange läuft, bis Peek - 1 ergibt. Dann ist die Datei fertiggelesen. (Weil kein Inhalt mehr da ist). Dann lesen wir eine Zeile aus und splitten sie. Danach geben wir den Namen und die Nummer aus. Am Schluß wieder den Stream zu der Datei schließen. Bei der Arbeit mit Dateien ist eine Fehlerbehandlung mit try...catch sehr zu empfehlen.

So, ich habe mich entschlossen, das Tutorial weiterzuschreiben.
Kapitel 2: Löschen, Verschieben von Dateien
In diesem Kapitel geht es um das Löschen, Verschieben von Dateien und wie man überprüfen kann, ob eine Datei existiert und wie man eine Datei mit dem Standardprogramm öffnen kann.(Das Programm, das geöffnet wird wenn man die Datei öffnet)

Abschnitt 1.1: Verschieben, Löschen, etc.
Dieser Punkt ist schnell abgehakt. Notwendig ist der Import von System.IO.

C#-Code:
File.Move(@"C:\Test.txt",@"D:\Test.txt";); // Datei verschieben. 1. Parameter: Quelle 2. Parameter: Ziel
File.Delete(@"D:\Test.txt";); // Datei löschen
File.Copy(@"C:\Test.txt", @"D:\Test.txt";) // Kopieren (Würde in diesem Fall eine Ausnahme aufrufen, da C:\Test.txt ja nicht existiert)

Die Methoden der Klasse File haben aber noch mehr drauf.

Man kann mit Ihnen auch den Erstellungszeitpunkt, den letzten Zugriffszeitpunkt und den Zeitpunkt der letzten Veränderung bekommen, ja diese Daten sogar beliebig verändern. Für folgendes Beispiel wird (wieder einmal) der Import des Namespaces System.IO benötigt.

C#-Code:
// Die genannten Daten aus der Datei Test.txt auslesen
Console.WriteLine("Erstellungszeitpunkt: \t"+File.GetCreationTime("C:\\Test.txt";));
Console.WriteLine("Letzter Zugriff: \t"+File.GetLastAccessTime("C:\\Test.txt";));
Console.WriteLine("Letzte Änderung: \t"+File.GetLastWriteTime("C:\\Test.txt";));

Welche Zeile was macht, sollte aus der Ausgabe des Programms und den Zeichenketten hervorgehen.


So, das war übrigens mein erstes Tutorial. Kommentare sind sehr erwünscht.

Changelog:
  • 27. 04. 06: Die Methode SaveTelephon Numbers aus dem 1. Codebeispiel static gemacht, da sonst das Beispiel nicht funktioniert (Danke an XGenne)
  • Den Konstruktor entfernt und den Code in die Main Methode verlagert (Danke an herbivore)

Dieser Beitrag wurde 5 mal editiert, zum letzten Mal von SimonKnight6600 am 26.02.2007 14:17.

Neuer Beitrag 07.06.2005 21:05 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegen mehr als 10 Monate.
hoenen01 hoenen01 ist männlich
myCSharp.de-Mitglied

Dabei seit: 20.04.2006
Beiträge: 8
Entwicklungsumgebung: dotnet
Herkunft: Chemnitz


hoenen01 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Dein Tutorial gefällt mir sehr gut. Ich als Anfänger freue mich besonders über solche Pionierarbeit. ;-)
Danke und weiter so!
m.f.g.
Sven
Neuer Beitrag 27.04.2006 09:42 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
SimonKnight6600 SimonKnight6600 ist männlich
myCSharp.de-Mitglied

avatar-1433.gif


Dabei seit: 09.03.2005
Beiträge: 709
Entwicklungsumgebung: Microsoft Visual Studio 2008
Herkunft: Österreich

Themenstarter Thema begonnen von SimonKnight6600

SimonKnight6600 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Sven!

Danke für das Lob. Ich hab vor kurzem begonnen, das Beispiel etwas auszubauen. Ich kann allerdings nicht sagen, wann ich damit fertig bin smile .

Gruß,
SimonKnight6600
Neuer Beitrag 27.04.2006 14:29 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegt mehr als ein Monat.
Eismaus
myCSharp.de-Mitglied

Dabei seit: 03.04.2006
Beiträge: 9


Eismaus ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hey, Danke für das Tutorial.
Ich war schon fast am verzweifeln, weil sowas "einfaches" nie in den Büchern beschrieben wird.

Grüße
Eismaus
Neuer Beitrag 02.06.2006 09:55 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
frisch frisch ist männlich
myCSharp.de-Mitglied

avatar-1724.gif


Dabei seit: 18.08.2005
Beiträge: 2.082
Entwicklungsumgebung: VS C# 2005 Express
Herkunft: Coburg / Oberfranken


frisch ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo SimonKnight6600,

ich würde das Tutorial gleich so performant wie möglich machen, z. B. mit einem using und darauf hinweisen, warum das benutzt wird.

Außerdem lässt die safety zu wünschen übrig, z. B. beim File.Create, was würde passieren, wenn die Datei schon existiert und geöffnet ist? Somit wäre kein Zugriff möglich. Und am besten nicht in einem Try-Catch auslagern, sondern erstmal überprüfen, ob die Datei existiert und dann kannst du einen try-catch machen, wobei im catch nur die SystemIOException abgefangen wird.

Zusätzlich solltest du die Referenz auf Windows.Forms rausnehmen, da in einem Tutorial nur die nötigsten dinge stehen sollten.

Ansonsten ist es ok.
Neuer Beitrag 02.06.2006 10:33 Beiträge des Benutzers | zu Buddylist hinzufügen
SimonKnight6600 SimonKnight6600 ist männlich
myCSharp.de-Mitglied

avatar-1433.gif


Dabei seit: 09.03.2005
Beiträge: 709
Entwicklungsumgebung: Microsoft Visual Studio 2008
Herkunft: Österreich

Themenstarter Thema begonnen von SimonKnight6600

SimonKnight6600 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo frisch!

Danke für die Vorschläge! Wie gesagt: Ich schreibe grad das Tutorial neu und werde die Vorschläge dabei berücksichtigen. In der neuen Version wird auch ein XML Teil enthalten sein.

Gruß,
SimonKnight6600
Neuer Beitrag 02.06.2006 23:01 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
tomx992 tomx992 ist männlich
myCSharp.de-Mitglied

Dabei seit: 23.06.2005
Beiträge: 19
Entwicklungsumgebung: Win 7


tomx992 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Klasse! Vielen Dank!

Endlich habe ich als Newbie es geschafft verständlich eine Datei abzuspeichern!

Daumen hoch Daumen hoch
Neuer Beitrag 22.06.2006 17:03 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Yves
myCSharp.de-Mitglied

Dabei seit: 26.06.2006
Beiträge: 7


Yves ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo SimonKnight6600!

Super Tutorial, hat mir echt geholfen, danke.

Hast du nun schon ein XML-Tutorial geschrieben? Würde mich sehr dafür interessieren.

Liebe Grüsse
Yves
Neuer Beitrag 26.06.2006 17:15 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
SimonKnight6600 SimonKnight6600 ist männlich
myCSharp.de-Mitglied

avatar-1433.gif


Dabei seit: 09.03.2005
Beiträge: 709
Entwicklungsumgebung: Microsoft Visual Studio 2008
Herkunft: Österreich

Themenstarter Thema begonnen von SimonKnight6600

SimonKnight6600 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Yves!

Danke für's Lob!

Zitat:
Original von Yves
Hast du nun schon ein XML-Tutorial geschrieben?

Jo, bin auch schon sehr weit. Ich muss das Teil aber noch ein wenig überarbeiten, denn ich hab Angst, dass das Zeug zu kompliziert geschrieben ist. Aber jetzt kommen ja eh' die Sommerferien, es sollte dadurch nicht mehr allzulange dauern ;-).

//Nachtrag: Der neue Artikel ist momentan 13 Seiten stark, er ist also jetzt schon ziemlich umfangreicher als der momentane.

Ich grüble momentan, ob ich die neue Version in einem separaten Thread veröffentlichem soll. Dann könnte ich weiterhin auf die alte Version verlinken, falls die neue Version zu viele Fehler enthält oder stellenweise zu kompliziert geschrieben ist...

Was sagt ihr dazu? Soll ich einfach den Artikel aktualisieren oder einen neuen anlegen?

Gruß,
SimonKnight6600

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von SimonKnight6600 am 26.06.2006 22:13.

Neuer Beitrag 26.06.2006 22:06 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.464
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo SimonKnight6600,

Zitat:
denn ich hab Angst, dass das Zeug zu kompliziert geschrieben ist.

"veröffentliche früh und häufig"

Siehe  Die Kathedrale und der Basar

herbivore
Neuer Beitrag 26.06.2006 22:11 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
SimonKnight6600 SimonKnight6600 ist männlich
myCSharp.de-Mitglied

avatar-1433.gif


Dabei seit: 09.03.2005
Beiträge: 709
Entwicklungsumgebung: Microsoft Visual Studio 2008
Herkunft: Österreich

Themenstarter Thema begonnen von SimonKnight6600

SimonKnight6600 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo herbivore!

Der Ansatz ist gut. Ich hab gerade meinen Post oben aktualisiert und ein wenig erweitert...

(Irgendwie schade, dass es keine Edit-Benachrichtung oder sowas gibt...)

Gruß,
SimonKnight6600
Neuer Beitrag 26.06.2006 22:15 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Yves
myCSharp.de-Mitglied

Dabei seit: 26.06.2006
Beiträge: 7


Yves ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
Original von SimonKnight6600
[...]
Ich muss das Teil aber noch ein wenig überarbeiten, denn ich hab Angst, dass das Zeug zu kompliziert geschrieben ist.
[...]

Du könntest mir das Tutorial doch mal schicken, dann kann ich dir sagen ob es kompliziert ist oder nicht. Bin Anfänger.

Gruss
Yves
Neuer Beitrag 27.06.2006 09:21 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegt mehr als ein Monat.
Diamantregen Diamantregen ist männlich
myCSharp.de-Mitglied

Dabei seit: 11.08.2006
Beiträge: 11


Diamantregen ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo SimonKnight6600,

tolles Tutorial fuer Newbies wie mich smile

Mich hat allerdings das [STAThread] etwas irritiert, da mir diese Syntax noch nicht bekannt ist. Kannst Du kurz erlaeutern, was das zu bedeuten hat? Danke.
Neuer Beitrag 11.08.2006 08:38 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Noodles
myCSharp.de-Poweruser/ Experte

Dabei seit: 08.02.2004
Beiträge: 4.644
Herkunft: Leipzig


Noodles ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Das ist ein Attrbiut.

Zitat:
Indicates that the COM threading model for an application is single-threaded apartment (STA).
Neuer Beitrag 11.08.2006 08:45 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.464
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo zusammen,

es gibt mittlerweile das  [Tutorial] Alles über Dateien 2.2

herbivore
Neuer Beitrag 11.08.2006 14:19 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 14 Jahre.
Der letzte Beitrag ist älter als 13 Jahre.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 15.10.2019 20:30