Laden...

[Tutorial] Dateioperationen: Alles über Dateien

Erstellt von SimonKnight6600 vor 18 Jahren Letzter Beitrag vor 17 Jahren 83.076 Views
S
SimonKnight6600 Themenstarter:in
709 Beiträge seit 2005
vor 18 Jahren
[Tutorial] Dateioperationen: Alles über Dateien

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.


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:

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)


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.


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.


// 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)

H
8 Beiträge seit 2006
vor 17 Jahren

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

S
SimonKnight6600 Themenstarter:in
709 Beiträge seit 2005
vor 17 Jahren

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

Gruß,
SimonKnight6600

E
9 Beiträge seit 2006
vor 17 Jahren

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

2.082 Beiträge seit 2005
vor 17 Jahren

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.

Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de

S
SimonKnight6600 Themenstarter:in
709 Beiträge seit 2005
vor 17 Jahren

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

Gelöschter Account
vor 17 Jahren

Klasse! Vielen Dank!

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

👍 👍

Y
7 Beiträge seit 2006
vor 17 Jahren

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

S
SimonKnight6600 Themenstarter:in
709 Beiträge seit 2005
vor 17 Jahren

Hallo Yves!

Danke für's Lob!

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

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo SimonKnight6600,

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

S
SimonKnight6600 Themenstarter:in
709 Beiträge seit 2005
vor 17 Jahren

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

Y
7 Beiträge seit 2006
vor 17 Jahren

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

D
11 Beiträge seit 2006
vor 17 Jahren

Hallo SimonKnight6600,

tolles Tutorial fuer Newbies wie mich 🙂

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.

N
4.644 Beiträge seit 2004
vor 17 Jahren

Das ist ein Attrbiut.

Indicates that the COM threading model for an application is single-threaded apartment (STA).

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo zusammen,

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

herbivore