C# Workshop - File Operations

3,431 views

Published on

That's the slides for our C# Workshop at Darmstadt

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,431
On SlideShare
0
From Embeds
0
Number of Embeds
179
Actions
Shares
0
Downloads
53
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

C# Workshop - File Operations

  1. 1. Dateien lesen, schreiben und verarbeiten C# Workshop, TU Darmstadt 2008, Präsentation von Qiong Wu (Microsoft Junior Student Partner)
  2. 2.  Input / Output  Zugriff auf Dateien und Ordner  Arbeiten mit Byte Streams  Reader und Writer Klassen verwenden  Komprimieren und Dekomprimieren von Daten  Isolated Storage
  3. 3. Output Input
  4. 4. Application Output
  5. 5. Application Input
  6. 6.  System.IO Namespace  Informelle Klassen ▪ FileSystemInfo ▪ FileInfo ▪ DirectoryInfo ▪ DriveInfo  Manipulierende Klassen ▪ File ▪ Directory ▪ Path
  7. 7.  Bietet Zugriff auf Informationen von Dateien und Ordnern  Basisklasse für FileInfo und DirectoryInfo
  8. 8.  Bietet Zugriff auf Informationen von Dateien
  9. 9. FileInfo deklarieren Dateipfad FileInfo NewFile = new FileInfo(@quot;C:NewTextFile.txtquot;); if (NewFile.Exists) Existiert die Datei? { Console.WriteLine(quot;Name: quot; + NewFile.Name); Console.WriteLine(quot;Fullname: quot; + NewFile.FullName); Console.WriteLine(quot;Size: quot; + NewFile.Length + quot; bytesquot;); } Attribute abfragen
  10. 10. FileInfo deklarieren Dateipfad FileInfo NewFile = new FileInfo(@quot;C:NewTextFile.txtquot;); if (NewFile.Exists) Existiert die Datei? { NewFile.CopyTo(@quot;C:NewTextFileCopy.txtquot;, true); } Überschreiben wenn Datei bereits vorhanden Datei kopieren
  11. 11.  Bietet  Zugriff auf Informationen von Ordnern  Auflistung von Ordnerinhalten  Elementaren Zugriff auf Ordner
  12. 12. DirectoryInfo deklarieren Ordnerpfad DirectoryInfo ourDir = new DirectoryInfo(@quot;C:windowsquot;); Console.WriteLine(quot;Directory: quot; + ourDir.FullName); foreach (FileInfo file in ourDir.GetFiles()) Attribute { abfragen Console.WriteLine(quot;File: quot; + file.Name); } Ordnerinhalt enumerieren
  13. 13.  Bietet  Zugriff auf Informationen von Laufwerken ▪ Speicherplatz ▪ Format ▪ Laufwerkstyp ▪ Name ▪ Status  Erbt nicht von FileSystemInfo
  14. 14. Laufwerke abrufen DriveInfo[] drives = DriveInfo.GetDrives(); foreach (DriveInfo drive in drives) { Console.WriteLine(quot;Drive: quot; + drive.Name); Console.WriteLine(quot;Type: quot; + drive.DriveType); if (drive.IsReady) { Console.WriteLine(quot;Free Space: quot; + drive.AvailableFreeSpace + quot; bytesquot;); } } Attribute abfragen
  15. 15.  Bietet Zugriff auf Pfadmanipulationen  Größtenteils oft benutzte Stringmanipulationen für Dateipfade  Path.Combine für Plattformunabhängigkeit wichtig!
  16. 16. 2 Pfade kombinieren Console.WriteLine(Path.Combine(quot;C:Windowsquot;, quot;System32rundll.exequot;)); Console.WriteLine(Path.GetExtension(Path.Combine(quot;C:Windowsquot;, quot;System32rundll.exequot;))); Dateierweiterung abfragen
  17. 17.  Auf Veränderungen im Dateisystem reagieren  FileSystemWatcher  Enable/disable  Filter Events  Auf Events registrieren  Changed  Created  Deleted  Renamed
  18. 18. FileSystemWatcher static void FileSystemWatcherTest() deklarieren { FileSystemWatcher watcher = new FileSystemWatcher(); watcher.Path = @quot;c:quot;; Zu überwachendes Verzeichnis 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; Auf Events } Eventauslösung aktivieren registrieren static void watcher_Changed(object sender, FileSystemEventArgs e) { Console.WriteLine(quot;Directory changed(quot; + e.ChangeType + quot;): quot; + e.FullPath); } Auf Änderungen reagieren
  19. 19.  Zugriff auf Datenströme  Stream Objekt  Stream Klassen ▪ MemoryStream ▪ CryptoStream ▪ NetworkStream ▪ GZipStream  Zugriff über StreamWriter / StreamReader
  20. 20.  Zugriff auf Streams wie auf ein Videoband  Abstraktion für sequentielle Datenvorgänge
  21. 21.  FileStream Objekt erstellen  Zu öffnende Datei bestimmen  mit Konstruktor  mit File.Open  FileMode festlegen  Öffnen  Schreiben ▪ Erstellen ▪ Anhängen
  22. 22.  statische Methoden für  Erzeugung von Datenstreams ▪ FileAccess ▪ FileMode  Einfache Dateimanipulation ▪ Kopieren ▪ Löschen ▪ Existenz prüfen ▪ Größe ▪ Etc.
  23. 23.  Statische Methoden für  Erzeugung von Verzeichnissen  Verändern von Verzeichnissen  Löschen von Verzeichnissen  Abfragen von Verzeichnisattributen
  24. 24.  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()
  25. 25. Datei erstellen mit File StreamWriter deklarieren Klasse StreamWriter Tex; Tex = File.CreateText(quot;C:NewTextFile.txtquot;); Wert schreiben Tex.WriteLine(quot;Hello World with StreamWriterquot;); Console.WriteLine(quot;File with name: quot; + ((FileStream)Tex.BaseStream).Name + quot; was written succesfullyquot;); Tex.Close(); BasisStream abfragen StreamWriter schließen
  26. 26. StreamReader deklarieren StreamReader re; re = File.OpenText(quot;C:NewTextFile.txtquot;); Console.WriteLine(re.ReadToEnd()); re.Close(); Datei öffnen mit File Klasse StreamReader schließen Inhalte der Datei ausgeben
  27. 27.  Schreiben / Lesen von binären Daten in einen beliebigen Stream  Gleiches Handling wie StreamWriter / Reader
  28. 28. FileStream erstellen FileStream BinaryStream = File.Create(@quot;C:NewBinary.binquot;); BinaryWriter bTex = new BinaryWriter(BinaryStream); bTex.Write(quot;this is binaryquot;); BinaryWriter mit bTex.Write(true); Stream bTex.Write('4'); initialisieren bTex.Close(); Daten in Stream schließen Stream schreiben
  29. 29. FileStream erstellen FileStream newFile = File.Open(@quot;C:NewBinary.binquot;, FileMode.Open); BinaryReader reader = new BinaryReader(newFile); string s = reader.ReadString(); BinaryReader mit bool b = reader.ReadBoolean(); Stream char c = reader.ReadChar(); initialisieren reader.Close(); Daten aus Stream schließen Stream lesen
  30. 30.  Warum  Schreiben auf Festplatte oft inperfomant  Kein Erstellen von temporären Dateien erwünscht  Benutzbar mit StreamWriter / Reader  Handling wie FileStream
  31. 31. MemoryStream memStrm = new MemoryStream(); MemoryStream deklarieren StreamWriter writer = new StreamWriter(memStrm); writer.WriteLine(quot;Helloquot;); writer.WriteLine(quot;Goodbyequot;); Daten Schreiben Stream an Writer übergeben schreiben writer.Flush(); erzwingen FileStream theFile = File.Create(@quot;c:inmemory.txtquot;); memStrm.WriteTo(theFile); Stream in writer.Close(); Datei theFile.Close(); schreiben memStrm.Close();
  32. 32.  Warum  FileStream schreibt direkt auf Festplatte ▪ Inperfomant  Hybride Mischung aus MemoryStream & FileStream  Kompatibel mit StreamWriter / Reader  Handling wie FileStream
  33. 33. FileStream erstellen FileStream newFile = File.Create(@quot;c:test.txtquot;); BufferedStream buffered = new BufferedStream(newFile); StreamWriter writer = new StreamWriter(buffered); writer.WriteLine(quot;Some dataquot;); FileStream writer.Close(); übergeben BufferedStream deklarieren StreamWriter mit BufferedStream erstellen
  34. 34.  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
  35. 35.  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
  36. 36.  Handling wie FileStream  Wrapping um bestehenden FileStream  CompressionMode Enum als Konstrukturargument
  37. 37. FileStreams FileStream sourceFile = File.OpenRead(@quot;c:test.txtquot;); erstellen FileStream destFile = File.Create(@quot;c:test.zipquot;); GZipStream GZipStream = new GZipStream(destFile, CompressionMode.Compress); int theByte = sourceFile.ReadByte(); while (theByte != -1) GZipStream um { FileStream GZipStream.WriteByte((byte)theByte); wrappen theByte = sourceFile.ReadByte(); } GZipStream.Close(); sourceFile.Close(); Daten destFile.Close(); schreiben
  38. 38. FileStream sourceFile = File.OpenRead(@quot;c:test.zipquot;); FileStream destFile = File.Create(@quot;c:test.txtquot;); 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();
  39. 39.  SharpZipLib  Tar  GZIP  ZIP  BZIP2
  40. 40.  OpenFileDialog  SaveFileDialog
  41. 41. OpenFileDialog deklarieren OpenFileDialog NewFileDialog = new OpenFileDialog(); NewFileDialog.Filter = quot;Textdateien (*.txt)|*.txt|Alle Dateien (*.*)|*.*quot;; if (NewFileDialog.ShowDialog() == DialogResult.OK) Filter festlegen { string s = NewFileDialog.FileName; MessageBox.Show(s); } Dateinamen Result abfragen abfragen
  42. 42. SaveFileDialog deklarieren SaveFileDialog NewFileDialog = new SaveFileDialog(); NewFileDialog.Filter = quot;Textdateien (*.txt)|*.txt|Alle Dateien (*.*)|*.*quot;; if (NewFileDialog.ShowDialog() == DialogResult.OK) Filter festlegen { string s = NewFileDialog.FileName; MessageBox.Show(s); } Result abfragen Dateinamen abfragen
  43. 43.  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
  44. 44.  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()
  45. 45.  Wie FileStream aber  Speziell um Dateien aus Isolated Storage zu lesen  Kompatibel mit StreamReader / Writer
  46. 46. Isolated Storage anfordern IsolatedStorageFile userStore = IsolatedStorageFile.GetUserStoreForAssembly(); Isolated FileStream erstellen IsolatedStorageFileStream userStream = new IsolatedStorageFileStream(quot;UserSettings.setquot;, FileMode.Create, userStore); StreamWriter userWriter = new StreamWriter(userStream); userWriter.WriteLine(quot;User Prefsquot;); userWriter.Close(); Daten in Stream schreiben
  47. 47.  Isolated Storage ist wie ein virtuelles Laufwerk  Ordnerstruktur  Dateistruktur  Abrufen von Ordnerliste mit GetDirectoryNames()  Abrufen von Dateiliste mit GetFileNames()
  48. 48. Isolated Storage anfordern IsolatedStorageFile userStore = IsolatedStorageFile.GetUserStoreForAssembly(); foreach (string isofilename in userStore.GetFileNames(quot;*quot;)) { MessageBox.Show(isofilename); } Dateien abrufen
  49. 49.  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

×