Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
Pfade, Text-Dateien und Binäre Dateien
Lesen und Schreiben von Dateien
Dr. Beatrice Amrhein
Überblick
� Der Verzeichnis-Pfad
� Kopieren, Verschieben, Ändern oder Löschen von Dateien
� Lesen und Schreiben von Text-Dateien
� Zeilenweises Lesen und Schreiben von Text-Dateien
� Lesen und Schreiben von Binär-Dateien
2Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Der Verzeichnis-Pfad
3
Definition
Je nach Betriebssystem besteht ein Pfad aus folgenden Elementen:
� einer Laufwerks- oder Datenträgerbezeichnung
� einer Liste von Verzeichnissen bzw. (Unter-)Verzeichnissen
� und einem Dateinamen (mit Endung)
4Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Verzeichnis-Pfad in Windows
� Laufwerksbezeichnung Zum Beispiel C:
� Verzeichnisse und UnterverzeichnisseZum Beispiel \Users\aeb1\CSharp\
� DateinameZum Beispiel Test.txt
Zusammengesetzt ergibt dies dannden Verzeichnis-Pfad:
C:\Users\aeb1\CSharp\Test.txt
5Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Verzeichnis-Pfad in Mac OS
� Laufwerksbezeichnung Zum Beispiel /MacHD
� Verzeichnisse und UnterverzeichnisseZum Beispiel /Dokumente/CSharp
� DateinameZum Beispiel Test.txt
Zusammengesetzt ergibt dies dann den Verzeichnis-Pfad:
/MacHD/Dokumente/CSharp/Test.txt
6Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Die C# Klasse Path
� Stellt statische Methoden für String-Objekte, welche Dateinamen oder Verzeichnispfade enthalten, zur Verfügung.
� Diese Methoden funktionieren für alle Plattformen gleich.
Einige Methoden der Klasse Path sind
7Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Befehl Beschreibung
GetFullPath(fileName) Gibt den (ganzen) Verzeichnispfad des Files mit Namen fileName (relativ oder absolut ) als String zurück.
GetDirectoryName(fullPath) Gibt den Namen des Verzeichnispfades ohne den File-Namen zurück.
GetPathRoot(fullPath) Gibt den Namen des Wurzelverzeichnisses (Laufwerk oder Volumen) des Pfades zurück.
GetFileName(fullPath) Gibt den Namen des Files unter diesem Verzeichnis-Pfades zurück.
GetExtension(fileName) Gibt die File-Endung des File-Namens zurück.
Ein C# Beispiel
using System;
using System.IO;
class Program
{
static void Main(string[] args)
{
string fileName = "bsp1.exe";
string fullPath = Path.GetFullPath(fileName);
Console.WriteLine("GetFullPath({0}) \n gibt\n{1}", fileName, fullPath);
string directoryName = Path.GetDirectoryName(fullPath);
Console.WriteLine("GetDirectoryName({0}) \n gibt\n{1}",
fullPath, directoryName);
8Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Name des erzeugten
.exe Files
Ein C# Beispiel
string pathRoot = Path.GetPathRoot(fullPath);
Console.WriteLine("GetPathRoot({0}) \n gibt\n{1}", fullPath, pathRoot);
string extension = Path.GetExtension(fileName);
Console.WriteLine("GetExtension({0}) \n gibt\n{1}", fileName, extension);
string result = Path.GetFileName(fullPath);
Console.WriteLine("GetFileName({0}) \n gibt\n{1}", fullPath, result);
9Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Ein zweites Beispiel
class Program
{
static void Main(string[] args)
{
/* Vorsicht: Doppelte Backslash!! */
string fileName = "C:\\tmp\\CSharp\\Test.txt";
string fullPath = Path.GetFullPath(fileName);
Console.WriteLine("GetFullPath({0}) \n gibt\n{1}", fileName, fullPath);
string directoryName = Path.GetDirectoryName(fullPath);
Console.WriteLine("GetDirectoryName({0}) \n gibt\n{1}",
fullPath, directoryName);
. . .
}
}
10Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Angabe des
vollständigen
Pfads
Kopieren von Dateien
11Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Die C# Klasse File
� Stellt statische Methoden zum Erstellen, Kopieren, Löschen, Verschieben und Öffnen von Dateien bereit.
� Diese Methoden funktionieren für alle Plattformen gleich.
Einige Methoden der Klasse File sind
12Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Befehl Beschreibung
Create(file) Erzeugt eine neue Datei mit dem Verzeichnispfad file.
Open(file, mode) Öffnet eine Datei zum Lesen oder Schreiben.
Exists(file) Gibt true zurück, falls eine Datei mit dem Pfad file existiert.
Copy(file1, file2, true) Kopiert die Datei mit Pfad-Name file1 an die Stelle (Pfad-Name) file2. truezeigt an, dass eine ev. vorhandenes Datei file2 überschrieben wird.
Move(file1, file2) Verschiebt die Datei mit Pfad-Name file1 an die Stelle (Pfad-Name) file2. Wirft eine Exception, falls file2 bereits existiert.
AppendAllText(file1, text) Fügt den String text am Ende in die Datei file1 ein.
Delete(file) Löscht die Datei im Verzeichnispfad file (falls es existiert).
Ein C# Beispiel
using System;
using System.IO;
class Program
{
static void Main(string[] args)
{
string fileName1 = "C:\\tmp\\CSharp\\Test.txt";
string fileName2 = "C:\\tmp\\Test.txt";
string fileName3 = "C:\\tmp\\CSharp\\Test1.txt";
try
{
// File kopieren (existierende Files werden überschrieben)
File.Copy(fileName1, fileName2, true);
13Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Die Datei C:\tmp\Csharp\Text.txt wird zuerst
nach C:\tmp kopiert.
Ein C# Beispiel
// File verschieben
File.Move(fileName2, fileName3);
// Text anfügen
File.AppendAllText(fileName3, "Neuer Text");
// Datei löschen
File.Delete(fileName3);
}
catch (IOException e)
{
Console.WriteLine(e.Message);
// lösche Datei fileName3 (falls vorhanden)
if (File.Exists(fileName3))
{ File.Delete(fileName3); }
}
}
14Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Die Datei C:\tmp\Text.txt wird nach
C:\tmp\CSharp\Text1.txt verschoben,
um den String “Neuer Text” verlängert,
um am Ende wieder gelöscht.
Falls ein Fehler aufgetreten ist, soll die
Datei unter fileName3 gelöscht werden.
Lesen und Schreiben von Text Dateien
15Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Lesen von Text-Dateien
Am einfachsten werden Text-Dateien durch einen der beiden BefehleReadAllText(fileName);
oder ReadAllLines(fileName);
gelesen.
ReadAllText() gibt den ganzen Inhalt in einem String zurück.
ReadAllLines() hat als Resultat einen String-Array
16Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Ein C# Beispiel
using System;
using System.IO;
class Program
{
static void Main()
{
string fileName = "C:\\tmp\\CSharp\\Test.txt";
string text = File.ReadAllText(fileName);
Console.WriteLine("Der Inhalt von Test.txt: \n{0}", text);
string[] lines = File.ReadAllLines(fileName);
Console.WriteLine("Der Inhalt von Test.txt:");
for (int i = 0; i < lines.Length; i++ )
{
Console.WriteLine(i + ". " + lines[i]);
}
17Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Die Datei
C:\tmp\CSharp\Text.txt wird gelesen und in den
String text eingefügt.
Die Datei
C:\tmp\CSharp\Text.txt wird zeilenweise in den
String lines eingefügt.
Ein C# Beispiel
// Zeilenweise einlesen und auf die Console ausgeben.
System.IO.StreamReader reader = new System.IO.StreamReader(fileName);
while (reader.Peek() > -1)
{
Console.WriteLine(reader.ReadLine());
}
reader.Close();
}
}
18Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Die Datei
C:\tmp\CSharp\Text.txt wird zeilenweise
eingelesen und sofort ausgegeben
Die Ausgabe
Zuerst Einlesen und Ausgebendes ganzen Datei-Inhaltes,
dann ganzen Inhalt einlesen und zeilenweise (nummeriert)ausgeben,
zuletzt zeilenweise einlesenund ausgeben
19Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Schreiben von Text-Dateien
Am einfachsten werden Text-Dateien durch einen der beiden BefehleWriteAllText(fileName, text);
oder WriteAllLines(fileName, textArray);
geschrieben.
Beide Methoden erzeugen jeweils eine neue Datei.
WriteAllText() erzeugt eine neue Datei mit dem Inhalt des Textes.
WriteAllLines() erzeugt eine neue Datei und fügt zeilenweise den Inhalt des textArrays ein.
20Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Schreiben von Text-Dateien
Flexibler ist das Schreiben in eine Datei mit Hilfe eines StreamWriter. Dieser fügt nach und nach die gewünschten Zeilen in die Datei ein.
Erzeugt wird ein StreamWriter durch den Konstruktor:StreamWriter writer = new StreamWriter(fileName);
Das Einfügen von neuem Text geschieht durch den Befehlwriter.WriteLine(text);
Am Ende muss der StreamWriter geschlossen werden.writer.Close();
21Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Ein C# Beispiel
using System;
using System.IO;
class Program
{
static void Main()
{
string path = "C:\\tmp\\CSharp\\";
string text = "Dieses Beispiel zeigt auf, . . . .";
File.WriteAllText(path+"Test1.txt", text);
string[] lines = { "1. Zeile eins", "2. Zeile zwei", "3. Zeile drei" };
File.WriteAllLines(path + "Test2.txt", lines);
22Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
In die Datei
C:\tmp\CSharp\Text1.txt wirdder String text eingefügt.
In die Datei
C:\tmp\CSharp\Text2.txt werdendie drei String-Zeilen aus lines
eingefügt.
Ein C# Beispiel
// nur gewisse Zeilen schreiben
StreamWriter writer = new StreamWriter(path + "Test3.txt");
foreach (string line in lines)
{
if (!line.Contains("2"))
{ writer.WriteLine(line); }
}
writer.WriteLine("4. Zeile vier");
writer.Close();
writer.Dispose();
}
}
23Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Die Datei
C:\tmp\CSharp\Text3.txt werden die Zeilen 1 und 3, sowie eine
neue Zeile 4 eingefügt.
Die erzeugten Dateien
24Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
File.WriteAllText(path+"Test1.txt", text);
File.WriteAllLines(path+"Test2.txt", lines);
StreamWriter writer =
new StreamWriter(path+"Test3.txt");
foreach(string line in lines)
{
if (!line.Contains("2"))
{ writer.WriteLine(line); }
}
Lesen und Schreiben von Binär-Dateien
25Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Die C# Klasse BinaryWriter
� Schreibt primitive Typen binär in einen Stream
� Unterstützt das Schreiben von Zeichenfolgen in einer bestimmten Codierung (z. B. UTF-8, UTF-16 oder ASCII).
Einige Methoden der Klasse BinaryWriter sind
26Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Befehl Beschreibung
BinaryWriter(stream) Erzeugt einen Writer, welcher auf den angegebenen Stream (z.B. ein File) schreiben kann.
BinaryWriter(stream, encoding) Erzeugt einen Writer, welcher die entsprechenden Codierung benutzt.
Write(data) Schreibt den Wert data (von einem beliebigen C# Basistyp wie z.B. int, float, bool, char, …) in den Stream.
Flush() Leert den Puffer und schreibt alle anstehenden Daten in den Stream.
Close() Schliesst den Writer und den zugrundeliegenden Stream. Dies ist nötig, damit die Datei sauber abgeschlossen wird.
Die C# Klasse BinaryReader
� Liest primitive Datentypen als Binärwerte
� Je nach Encoding wird eine spezifische Codierung verwendet.
Einige Methoden der Klasse BinaryReaders sind:
27Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Befehl Beschreibung
BinaryReader(stream) Erzeugt einen Reader, welcher aus dem angegebenen Stream (z.B. ein File) lesen kann.
BinaryReader(stream, encoding) Erzeugt einen Reader, welcher die entsprechenden Codierung benutzt.
ReadChar() Liest aus dem unterliegenden Stream ein char-Zeichen
ReadInt16() Liest aus dem unterliegenden Stream einen Integer Wert
ReadInt32() Liest aus dem unterliegenden Stream eine long Zahl
ReadSingle() Liest aus dem unterliegenden Stream eine float Zahl
ReadDouble() Liest aus dem unterliegenden Stream einen double Wert
ReadBoolean() Liest aus dem unterliegenden Stream einen Boolean Wert
Close() Schliesst den Reader und den zugrundeliegenden Stream.
Ein C# Beispiel
using System;
using System.IO;
class BinaerSchreiben
{
const string fileName = "Schraube.dat";
static void Main()
{
BinaryWriter writer =
new BinaryWriter(File.Open(fileName, FileMode.OpenOrCreate));
for (int i = 1; i < 4; i++)
{
writer.Write(i * 15); // Schreiben einer int Zahl
writer.Write(3+i/2.0); // Schreiben einer double Zahl
writer.Write(true); // Schreiben eines bool Werts
}
writer.Close();
28Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
In die Datei Schraube.dat werden
neue Werte (int, double und boolen) eingefügt.
Am Ende muss der writer geschlossen werden, sonst ist die
Datei nicht wieder verwendbar!
Schraube.dat
Ein C# Beispiel
if (File.Exists(fileName))
{
BinaryReader reader =
new BinaryReader(File.Open(fileName, FileMode.Open));
while (reader.PeekChar() > -1)
{
int l = reader.ReadInt32(); // Lesen einer Int Zahl
double d = reader.ReadDouble(); // Lesen einer Doulbe Zahl
Boolean f = reader.ReadBoolean(); // Lesen eines Boolean Wert
Schraube schraube2 = new Schraube(l, d, f);
schraube2.Ausgabe();
}
reader.Close();
}
}
29Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012
Die aus der Datai gelesenen Werte
haben einen C# Datentyp und können darum direkt
weiterverwendet werden.
Die Klasse Schraube
public class Schraube
{
private int Laenge;
private double Dicke;
private Boolean Flachkopf;
public Schraube(int l, double d, Boolean f)
{
this.Laenge = l; this.Dicke = d; this.Flachkopf = f;
}
public void Ausgabe()
{
Console.WriteLine("Schraube: Länge: {0}mm, Dicke: {1}mm,
Flachkopf: {2}\n", Laenge, Dicke, Flachkopf);
}
}
30Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012