Date post: | 10-May-2015 |
Category: |
Technology |
Upload: | qiong-wu |
View: | 3,102 times |
Download: | 0 times |
FileOperations mit C#Dateien lesen, schreiben und verarbeiten
C# Workshop, TU Darmstadt 2008, Präsentation von Qiong Wu (Microsoft Junior Student Partner)
Todo:
Input / Output Zugriff auf Dateien und Ordner Arbeiten mit Byte Streams Reader und Writer Klassen verwenden Komprimieren und Dekomprimieren von
Daten Isolated Storage
Input / Output – Was ist das?
Output
Input
OutputApplication
Daten müssen immer gespeichert werden!!!
InputApplication
Daten müssen auch immer geladen
werden!!!
File Systemklassen
System.IO Namespace Informelle Klassen▪ FileSystemInfo▪ FileInfo▪ DirectoryInfo
▪ DriveInfo Manipulierende Klassen▪ File▪ Directory▪ Path
FileSystemInfo Klasse
Bietet Zugriff auf Informationen von Dateien und Ordnern
Basisklasse für FileInfo und DirectoryInfo
FileInfo Klasse
Bietet Zugriff auf Informationen von Dateien
Beispiel: Informationen abrufen mit FileInfo
FileInfo NewFile = new FileInfo(@"C:\NewTextFile.txt"); if (NewFile.Exists){ Console.WriteLine("Name: " + NewFile.Name); Console.WriteLine("Fullname: " + NewFile.FullName); Console.WriteLine("Size: " + NewFile.Length + " bytes");}
FileInfo deklarieren Dateipfad
Existiert die Datei?
Attribute abfragen
Beispiel: Elementare Operationen mit FileInfo
FileInfo NewFile = new FileInfo(@"C:\NewTextFile.txt"); if (NewFile.Exists){ NewFile.CopyTo(@"C:\NewTextFileCopy.txt", true);
}
FileInfo deklarieren Dateipfad
Existiert die Datei?
Datei kopieren
Überschreiben wenn Datei
bereits vorhanden
DirectoryInfo Klasse
Bietet Zugriff auf Informationen von Ordnern Auflistung von Ordnerinhalten Elementaren Zugriff auf Ordner
Beispiel: Informationen abrufen mit DirectoryInfo
DirectoryInfo ourDir = new DirectoryInfo(@"C:\windows"); Console.WriteLine("Directory: " + ourDir.FullName); foreach (FileInfo file in ourDir.GetFiles()){ Console.WriteLine("File: " + file.Name);}
DirectoryInfo deklarieren
Ordnerpfad
Attribute abfragen
Ordnerinhalt enumerieren
DriveInfo Klasse
Bietet Zugriff auf Informationen von
Laufwerken▪ Speicherplatz▪ Format▪ Laufwerkstyp▪ Name▪ Status
Erbt nicht von FileSystemInfo
DriveInfo Klasse
DriveInfo[] drives = DriveInfo.GetDrives(); foreach (DriveInfo drive in drives){ Console.WriteLine("Drive: " + drive.Name); Console.WriteLine("Type: " + drive.DriveType); if (drive.IsReady) { Console.WriteLine("Free Space: " + drive.AvailableFreeSpace +
" bytes"); }}
Laufwerke abrufen
Attribute abfragen
Path Klasse
Bietet Zugriff auf Pfadmanipulationen
Größtenteils oft benutzte Stringmanipulationen für Dateipfade
Path.Combine für Plattformunabhängigkeit wichtig!
Beispiel: Path Klasse
Console.WriteLine(Path.Combine("C:\\Windows", "System32\\rundll.exe"));
Console.WriteLine(Path.GetExtension(Path.Combine("C:\\Windows", "System32\\rundll.exe")));
2 Pfade kombinieren
Dateierweiterung abfragen
File Events
Auf Veränderungen im Dateisystem reagieren
FileSystemWatcher Enable/disable Filter Events
Auf Events registrieren Changed Created Deleted Renamed
Beispiel: File Events
static void FileSystemWatcherTest() { FileSystemWatcher watcher = new FileSystemWatcher(); watcher.Path = @"c:\"; watcher.Created += new FileSystemEventHandler(watcher_Changed); watcher.Renamed += new RenamedEventHandler(watcher_Changed); watcher.Deleted += new FileSystemEventHandler(watcher_Changed); watcher.Changed += new FileSystemEventHandler(watcher_Changed); watcher.EnableRaisingEvents = true; } static void watcher_Changed(object sender, FileSystemEventArgs e) { Console.WriteLine("Directory changed(" + e.ChangeType + "): " + e.FullPath); }
FileSystemWatcher deklarieren
Zu überwachendes Verzeichnis
Auf Events registrieren
Eventauslösung aktivieren
Auf Änderungen reagieren
Streams
Zugriff auf Datenströme Stream Objekt
Stream Klassen▪ MemoryStream▪ CryptoStream▪ NetworkStream▪ GZipStream
Zugriff über StreamWriter / StreamReader
Zugriff auf Streams
Zugriff auf Streams wie auf ein Videoband
Abstraktion für sequentielle Datenvorgänge
Streams nach Benutzung
immer schließen!
FileStream
FileStream Objekt erstellen Zu öffnende Datei bestimmen
mit Konstruktor mit File.Open
FileMode festlegen Öffnen Schreiben▪ Erstellen▪ Anhängen
File Klasse
statische Methoden für Erzeugung von Datenstreams▪ FileAccess▪ FileMode
Einfache Dateimanipulation▪ Kopieren▪ Löschen▪ Existenz prüfen▪ Größe▪ Etc.
Directory Klasse
Statische Methoden für Erzeugung von Verzeichnissen Verändern von Verzeichnissen Löschen von Verzeichnissen Abfragen von Verzeichnisattributen
StreamWriter / StreamReader
Schreiben / Lesen von Text in einen beliebigen Stream Zeichen Zeile Absatz Bis zum Ende
Übergabe eines Stream Objekts Benutzung wie Console Gesamten Inhalt auslesen mit
ReadToEnd()
Beispiel: StreamWriter
StreamWriter Tex;Tex = File.CreateText("C:\\NewTextFile.txt");Tex.WriteLine("Hello World with StreamWriter");Console.WriteLine("File with name: " +
((FileStream)Tex.BaseStream).Name + " was written succesfully");Tex.Close();
StreamWriter deklarieren
Datei erstellen mit File Klasse
BasisStream abfragen
StreamWriter schließen
Wert schreiben
Beispiel StreamReader
StreamReader re;re = File.OpenText("C:\\NewTextFile.txt");Console.WriteLine(re.ReadToEnd());re.Close();
StreamReader deklarieren
Datei öffnen mit File Klasse
Inhalte der Datei ausgeben
StreamReader schließen
BinaryWriter / BinaryReader
Schreiben / Lesen von binären Daten in einen beliebigen Stream
Gleiches Handling wie StreamWriter / Reader
Beispiel: BinaryWriter
FileStream BinaryStream = File.Create(@"C:\NewBinary.bin");
BinaryWriter bTex = new BinaryWriter(BinaryStream);
bTex.Write("this is binary");bTex.Write(true);bTex.Write('4');
bTex.Close();
Daten in Stream
schreiben
FileStream erstellen
BinaryWriter mit Stream initialisieren
Stream schließen
Beispiel: BinaryReader
FileStream newFile = File.Open(@"C:\NewBinary.bin", FileMode.Open);
BinaryReader reader = new BinaryReader(newFile);
string s = reader.ReadString();bool b = reader.ReadBoolean();char c = reader.ReadChar(); reader.Close();
Daten aus Stream lesen
FileStream erstellen
BinaryReader mit Stream initialisieren
Stream schließen
MemoryStream
Warum Schreiben auf Festplatte oft inperfomant Kein Erstellen von temporären Dateien
erwünscht Benutzbar mit StreamWriter / Reader Handling wie FileStream
Beispiel: MemoryStream
MemoryStream memStrm = new MemoryStream();
StreamWriter writer = new StreamWriter(memStrm);writer.WriteLine("Hello");writer.WriteLine("Goodbye"); writer.Flush(); FileStream theFile = File.Create(@"c:\inmemory.txt"); memStrm.WriteTo(theFile); writer.Close();theFile.Close();memStrm.Close();
MemoryStream deklarieren
Stream an Writer übergeben
Daten schreibe
n
Schreiben
erzwingen
Stream in Datei
schreiben
BufferedStream
Warum FileStream schreibt direkt auf Festplatte▪ Inperfomant
Hybride Mischung aus MemoryStream & FileStream
Kompatibel mit StreamWriter / Reader
Handling wie FileStream
Beispiel: BufferedStream
FileStream newFile = File.Create(@"c:\test.txt");
BufferedStream buffered = new BufferedStream(newFile);StreamWriter writer = new StreamWriter(buffered);writer.WriteLine("Some data");writer.Close();
FileStream erstellen
FileStream übergeben
BufferedStream
deklarierenStreamWriter
mit BufferedStream erstellen
Komprimierung
Speichern von Rohdaten benötigt viel Platz Kompression – ein wichtiges Feld der
Informatik Durch Kompression wird mehr Bandbreite
ermöglicht als durch Hardwareoptimierung Digitales Zeitalter setzt auf Kompression
Eingebaute Kompression in C# DeflateStream GZipStream
NameSpace: System.IO.Compression
GZipStream vs DeflateStream Gleicher Kompressionsalgorithmus Ähnlicher Umgang GZipStream
Header mit zusätzlichen Informationen▪ Bessere Kompatibilität
Für Verteilung von Komprimierten Daten Arbeit auf mehreren Platformen
DeflateStream verzichtet auf zusätzliche Informationen▪ Geringerer Speicherverbrauch
Single System Kompression
GZipStream & DeflateStream
Handling wie FileStream Wrapping um bestehenden
FileStream CompressionMode Enum als
Konstrukturargument
Beispiel: Compression StreamFileStream sourceFile = File.OpenRead(@"c:\test.txt");FileStream destFile = File.Create(@"c:\test.zip"); GZipStream GZipStream = new GZipStream(destFile, CompressionMode.Compress); int theByte = sourceFile.ReadByte();while (theByte != -1){ GZipStream.WriteByte((byte)theByte); theByte = sourceFile.ReadByte();}
GZipStream.Close();sourceFile.Close();destFile.Close();
FileStreams erstellen
GZipStream um
FileStream wrappen
Daten schreiben
Beispiel: Decompression StreamFileStream sourceFile = File.OpenRead(@"c:\test.zip");FileStream destFile = File.Create(@"c:\test.txt");GZipStream compStream = new GZipStream(sourceFile,
CompressionMode.Decompress); int theByte = compStream.ReadByte();while (theByte != -1){ destFile.WriteByte((byte)theByte); theByte = compStream.ReadByte();} compStream.Close();destFile.Close();sourceFile.Close();
Alternativen zur Datenkompression
SharpZipLib Tar GZIP ZIP BZIP2
Dialoge
OpenFileDialog SaveFileDialog
Beispiel: OpenFileDialog
OpenFileDialog NewFileDialog = new OpenFileDialog();NewFileDialog.Filter = "Textdateien (*.txt)|*.txt|Alle Dateien
(*.*)|*.*";
if (NewFileDialog.ShowDialog() == DialogResult.OK){ string s = NewFileDialog.FileName; MessageBox.Show(s);}
OpenFileDialog
deklarieren
Filter festlegen
Result abfragenDateinamen
abfragen
Beispiel: SaveFileDialog
SaveFileDialog NewFileDialog = new SaveFileDialog();NewFileDialog.Filter = "Textdateien (*.txt)|*.txt|Alle Dateien
(*.*)|*.*";
if (NewFileDialog.ShowDialog() == DialogResult.OK){ string s = NewFileDialog.FileName; MessageBox.Show(s);}
SaveFileDialog deklarieren
Filter festlegen
Result abfragenDateinamen
abfragen
Isolated Storage
Warum Direkter Zugriff auf das Dateisystem
birgt Risiken SandBox Konzept bietet optimalen
Tradeoff zwischen Sicherheit und Funktion
IsolatedStorageFile Klasse Erstellung eines Stores NameSpace:
System.IO.IsolatedStorage
Isolated Storage - Scopes
Scope definiert den Kontext des Stores Assembly / Machine▪ Spezifiziert für die Maschine / Assembly▪ Anwendungsdaten▪ GetMachineStoreForAssembly()
Assembly / User▪ Spezifiziert für die Assembly / User▪ Userbezogene Daten▪ GetUserStoreForAssembly()
IsolatedStorageFileStream Klasse
Wie FileStream aber Speziell um Dateien aus Isolated Storage
zu lesen Kompatibel mit StreamReader /
Writer
Beispiel: IsolatedStorageFileStream Klasse
IsolatedStorageFile userStore = IsolatedStorageFile.GetUserStoreForAssembly();
IsolatedStorageFileStream userStream = new IsolatedStorageFileStream("UserSettings.set", FileMode.Create, userStore);
StreamWriter userWriter = new StreamWriter(userStream);userWriter.WriteLine("User Prefs");userWriter.Close();
Isolated Storage anfordern
Isolated FileStream erstellen
Daten in Stream schreiben
Ordner in Isolated Storage
Isolated Storage ist wie ein virtuelles Laufwerk Ordnerstruktur Dateistruktur
Abrufen von Ordnerliste mit GetDirectoryNames()
Abrufen von Dateiliste mit GetFileNames()
Beispiel: Ordner in Isolated Storage
IsolatedStorageFile userStore = IsolatedStorageFile.GetUserStoreForAssembly();
foreach (string isofilename in userStore.GetFileNames("*")){ MessageBox.Show(isofilename);}
Dateien abrufen
Isolated Storage anfordern
Zusammenfassung
Wir haben gelernt Umgang mit Dateien▪ Datei / Ordner / Laufwerksinformationen abfragen▪ Änderungen in der Ordnerstruktur überwachen▪ Streams aus Dateien erstellen
Umgang mit Streams▪ Dateien bearbeiten mit FileStream▪ Speicher schreiben / lesen mit MemoryStream▪ Effizient Dateien schreiben mit BufferedStream▪ Schreiben und Lesen mit StreamWriter / Reader▪ Komprimierung mit GZipStream / DeflateStream
FileDialoge▪ Abfragen von Speicherorten
Isolated Storage▪ Sandboxfunktionen des .net Frameworks nutzen
Fragen?