Datei- und Stream-E/A

Datei- und Stream-E/A (Eingabe/Ausgabe) bezieht sich auf die Übertragung von Daten auf ein oder von einem Speichermedium. In .NET enthalten die System.IO-Namespaces Typen, die das synchrone und asynchrone Lesen und Schreiben in Datenströmen und Dateien ermöglichen. Diese Namespaces enthalten zudem Typen für die Komprimierung und Dekomprimierung von Dateien sowie Typen für die Kommunikation über Pipes und serielle Anschlüsse.

Eine Datei ist eine geordnete, mit einem Namen versehene Auflistung von dauerhaft gespeicherten Bytes. Beim Umgang mit Dateien arbeiten Sie mit Verzeichnispfaden, Datenträgern sowie mit Datei- und Verzeichnisnamen. Im Unterschied dazu, handelt es sich bei einem Stream um eine Sequenz von Bytes, die zum Lesen von und zum Schreiben in einen Sicherungsspeicher verwendet wird, für den unterschiedliche Speichermedien (z. B. Festplatten oder Arbeitsspeicher) verwendet werden können. Ebenso wie es neben Festplatten mehrere andere Sicherungsspeicher gibt, gibt es neben Dateistreams zusätzlich Netzwerk-, Speicher- und Pipestreams.

Dateien und Verzeichnisse

Sie können die Typen im System.IO-Namespace verwenden, um mit Dateien und Verzeichnissen zu interagieren. Beispielsweise können Sie Eigenschaften für Dateien und Verzeichnisse abrufen und festlegen oder Auflistungen von Dateien und Verzeichnissen anhand von Suchkriterien abrufen.

Informationen zu Dateibenennungskonventionen und wie Sie einen Dateipfad für Windows-Systeme formulieren können (z. B. die DOS-Gerätesyntax, die in .NET Core 1.1 und höher und in .NET Framework 4.6.2 und höher unterstützt wird) finden Sie unter File path formats on Windows systems (Dateipfadformate unter Windows-Systemen).

Im Folgenden sind einige häufig verwendete Datei- und Verzeichnisklassen aufgeführt:

  • File – stellt statische Methoden zum Erstellen, Kopieren, Löschen, Verschieben und Öffnen von Dateien zur Verfügung und unterstützt das Erstellen eines FileStream-Objekts.

  • FileInfo – stellt Instanzmethoden zum Erstellen, Kopieren, Löschen, Verschieben und Öffnen von Dateien zur Verfügung und unterstützt das Erstellen eines FileStream-Objekts.

  • Directory – stellt statische Methoden zum Erstellen, Verschieben und Auflisten von Verzeichnissen und Unterverzeichnissen zur Verfügung.

  • DirectoryInfo – stellt Instanzmethoden zum Erstellen, Verschieben und Auflisten von Verzeichnissen und Unterverzeichnissen zur Verfügung.

  • Path – stellt Methoden und Eigenschaften für die plattformübergreifende Verarbeitung von Verzeichniszeichenfolgen zur Verfügung.

Beim Aufrufen von Methoden des Dateisystems sollten Sie immer eine robuste Ausnahmebehandlung zur Verfügung stellen. Weitere Informationen hierzu finden Sie unter Behandeln von E/A-Fehlern.

Neben der Verwendung dieser Klassen können Benutzer von Visual Basic die von der Microsoft.VisualBasic.FileIO.FileSystem-Klasse für Datei-E/A-Vorgänge bereitgestellten Methoden und Eigenschaften verwenden.

Weitere Informationen finden Sie unter How to: Kopieren von Verzeichnissen, Vorgehensweise: Erstellen einer Verzeichnisauflistung und Vorgehensweise: Auflisten von Verzeichnissen und Dateien.

Streams

Die abstrakte Stream-Basisklasse unterstützt das Lesen und Schreiben von Bytes. Alle Klassen, die Streams darstellen, erben von der Stream-Klasse. Die Stream-Klasse und die davon abgeleiteten Klassen stellen eine allgemeine Ansicht von Datenquellen und Repositorys bereit, sodass Programmierer sich nicht mit den Einzelheiten des Betriebssystems und der jeweiligen Geräte befassen müssen.

Streams umfassen drei grundlegende Vorgänge:

  • Lesen – Übertragen der Daten von einem Stream in eine Datenstruktur, beispielsweise in ein Bytearray.

  • Schreiben – Übertragen von Daten aus einer Datenquelle in einen Stream.

  • Suchen – Abfragen und bearbeiten der aktuellen Position innerhalb eines Streams.

Abhängig von der zugrunde liegenden Datenquelle oder vom Repository unterstützt ein Stream möglicherweise nur einige dieser Funktionen. Die PipeStream-Klasse unterstützt beispielsweise keine Suchvorgänge. Die CanRead-, CanWrite- und CanSeek-Eigenschaften eines Stream geben die Vorgänge an, die vom Stream unterstützt werden.

Im Folgenden sind einige häufig verwendete Streamklassen aufgeführt:

  • FileStream – Lesen und Schreiben in einer Datei.

  • IsolatedStorageFileStream – Lesen und Schreiben in einer Datei im isolierten Speicher.

  • MemoryStream – Lesen und Schreiben im Arbeitsspeicher als Sicherungsspeicher.

  • BufferedStream – Verbessern der Leistung von Lese- und Schreibvorgängen.

  • NetworkStream – Lesen und Schreiben über Netzwerksockets.

  • PipeStream – Lesen und Schreiben über anonyme und benannte Pipes.

  • CryptoStream – Verknüpfen von Datenstreams mit kryptografischen Transformationen.

Ein Beispiel für asynchrones Arbeiten mit Streams finden Sie unter Asynchrone Datei-E/A.

Reader und Writer

Der System.IO-Namespace stellt zudem Typen zum Lesen und Schreiben von codierten Zeichen in Streams bereit. Normalerweise werden Streams für die Eingabe und Ausgabe von Bytes verwendet. Die Reader- und Writer-Typen übernehmen die Konvertierung der codierten Zeichen in Bytes und umgekehrt, sodass der Vorgang im Stream abgeschlossen werden kann. Jede Reader- und Writer-Klasse ist einem Stream zugeordnet, der durch die BaseStream-Eigenschaft der Klasse abgerufen werden kann.

Im Folgenden werden einige häufig verwendete Reader- und Writer-Klassen aufgeführt:

  • BinaryReader und BinaryWriter – Lesen und Schreiben von primitiven Datentypen als Binärwerte.

  • StreamReader und StreamWriter – Lesen und Schreiben von Zeichen mithilfe eines Codierungswerts, der die Zeichen in Bytes konvertiert und umgekehrt.

  • StringReader und StringWriter -– Lesen und Schreiben von Zeichen in und aus Zeichenfolgen.

  • TextReader und TextWriter – abstrakte Basisklassen für andere Reader und Writer, die Zeichen und Zeichenfolgen, jedoch keine Binärdaten, lesen und schreiben.

Weitere Informationen finden Sie unter How to: Lesen aus einer Textdatei, Vorgehensweise: Schreiben von Text in eine Datei, Vorgehensweise: Lesen von Zeichen aus einer Zeichenfolge und Vorgehensweise: Schreiben von Zeichen in eine Zeichenfolge.

Asynchrone E/A-Vorgänge

Das Lesen oder Schreiben einer großen Datenmenge kann ressourcenintensiv sein. Damit Ihre Anwendung weiterhin auf Benutzerinteraktionen reagiert, sollten Sie diese Aufgaben asynchron ausführen. Bei synchronen E/A-Vorgängen wird der UI-Thread blockiert, bis der ressourcenintensive Vorgang abgeschlossen ist. Verwenden Sie beim Entwickeln von Windows Store-Apps Version 8.x asynchrone E/A-Vorgänge, damit nicht der Eindruck erweckt wird, dass Ihre App nicht mehr reagiert.

Die asynchronen Member enthalten den Begriff Async in ihren Namen, z. B. die Methoden CopyToAsync, FlushAsync, ReadAsync und WriteAsync. Diese Methoden müssen mit den Schlüsselwörtern async und await verwendet werden.

Weitere Informationen finden Sie unter Asynchrone Datei-E/A.

Komprimierung

Komprimierung bezieht sich auf das Verkleinern einer Datei zum Zweck der Speicherung. Bei einer Dekomprimierung wird der Inhalt einer komprimierten Datei extrahiert und in ein verwendbares Format gebracht. Der System.IO.Compression-Namespace enthält Typen zum Komprimieren und Dekomprimieren von Dateien und Streams.

Die folgenden Klassen werden häufig zum Komprimieren und Dekomprimieren von Dateien und Streams verwendet:

  • ZipArchive – Erstellen und Abrufen von Einträgen im ZIP-Archiv.

  • ZipArchiveEntry – Darstellen einer komprimierten Datei.

  • ZipFile – Erstellen, Extrahieren und Öffnen eines komprimierten Pakets.

  • ZipFileExtensions – Erstellen und Extrahieren von Einträgen in einem komprimierten Paket.

  • DeflateStream – Komprimieren und Dekomprimieren von Streams mit dem Deflate-Algorithmus.

  • GZipStream – Komprimieren und Dekomprimieren von Streams im gzip-Datenformat.

Weitere Informationen finden Sie unter How to: Komprimieren und Extrahieren von Dateien.

Isolierter Speicher

Isolierte Speicherung ist ein Mechanismus zur Datenspeicherung, der Isolation und Sicherheit gewährleistet. Dies wird durch die Definition standardisierter Verknüpfungen von Code mit gespeicherten Daten ermöglicht. Der Speicher enthält ein virtuelles Dateisystem, das nach Benutzer, Assembly und Domäne (optional) isoliert ist. Ein isolierter Speicher ist besonders nützlich, wenn Ihre Anwendung keine Berechtigung für den Zugriff auf Benutzerdateien hat. Sie können die Einstellungen oder Dateien für die Anwendung so speichern, dass eine Kontrolle durch die Sicherheitsrichtlinien des Computers gewährleistet ist.

Isolierter Speicher ist für Windows Store-Apps Version 8.x nicht verfügbar. Verwenden Sie stattdessen Anwendungsdatenklassen im Windows.Storage-Namespace. Weitere Informationen finden Sie unter Anwendungsdaten.

Die folgenden Klassen werden häufig zum Implementieren isolierter Speicher verwendet:

Weitere Informationen finden Sie unter Isolierter Speicher.

E/A-Vorgänge in Windows Store-Apps

Die .NET für Windows 8.x Store-Apps enthalten viele der Typen zum Lesen und Schreiben in Streams. Jedoch sind nicht alle E/A-Typen von .NET verfügbar.

Beachten Sie jedoch die folgenden wichtigen Unterschiede, wenn Sie E/A-Vorgänge in Windows Store-Apps Version 8.x verwenden:

Sie können .NET Framework-Streams in Windows-Runtime-Streams konvertieren und umgekehrt, falls erforderlich. Weitere Informationen finden Sie unter Vorgehensweise: Konvertieren zwischen .NET Framework-Streams und Windows-Runtime-Streams oder unter WindowsRuntimeStreamExtensions.

Weitere Informationen zu E/A-Vorgängen in einer Windows Store-App Version 8.x finden Sie unter Schnellstart: Lesen und Schreiben von Dateien.

E/A und Sicherheit

Wenn Sie die Klassen im System.IO-Namespace verwenden, müssen die Sicherheitsanforderungen des Betriebssystems erfüllt sein, z. B. Zugriffssteuerungslisten (ACLs), um den Zugriff auf Dateien und Verzeichnisse zu steuern. Dies gilt zusätzlich zu anderen FileIOPermission-Anforderungen. ACLs können programmgesteuert verwaltet werden. Weitere Informationen finden Sie unter Vorgehensweise: Hinzufügen oder Entfernen von Zugriffssteuerungslisten-Einträgen.

Standardsicherheitsrichtlinien verhindern den Zugriff von Internet- oder Intranetanwendungen auf Dateien, die sich auf dem Computer des Benutzers befinden. Verwenden Sie daher beim Schreiben von Code, der über das Internet oder Intranet heruntergeladen wird, keine E/A-Klassen, für die ein Pfad zu einer physischen Datei erforderlich ist. Verwenden Sie stattdessen den isolierten Speicher für .NET-Anwendungen.

Eine Sicherheitsüberprüfung wird nur beim Erstellen des Streams ausgeführt. Übergeben Sie daher keinen geöffneten Stream an weniger vertrauenswürdigen Code oder an Anwendungsdomänen.

  • Allgemeine E/A-Aufgaben
    Stellt eine Liste von E/A-Aufgaben bereit, die Dateien, Verzeichnissen und Streams zugeordnet sind, und verknüpft jede Aufgabe mit relevanten Inhalten und Beispielen.

  • Asynchrone Datei-E/A
    Beschreibt die Leistungsvorteile und den grundlegenden Ablauf der asynchronen E/A.

  • Isolierter Speicher
    Beschreibt einen Mechanismus zur Datenspeicherung, der durch Definition einer standardisierten Zuordnung von Code zu gespeicherten Daten Isolierung und Sicherheit gewährleistet.

  • Pipes
    Beschreibt anonyme und benannte Pipevorgänge in .NET.

  • Speicherabbilddateien
    Beschreibt Speicherabbilddateien, die den Inhalt von Dateien auf dem Datenträger im virtuellen Arbeitsspeicher enthalten. Sie können Speicherabbilddateien verwenden, um sehr große Dateien zu bearbeiten und gemeinsam genutzten Speicherbereich für die prozessübergreifende Kommunikation zu erstellen.