Dateioperationen in .NET:Erstellen, Lesen, Aktualisieren, Löschen und Suchen

 C Programming >> C-Programmierung >  >> Tags >> .NET
Dateioperationen in .NET:Erstellen, Lesen, Aktualisieren, Löschen und Suchen

.NET verfügt über eine gute Datei-API auf hoher Ebene, die die Komplexität von Dateioperationen abstrahiert. Sie können mit einem einzigen Methodenaufruf Dateien erstellen, lesen, aktualisieren, löschen und suchen.

Es ist flexibel und bietet mehrere Ansätze, sodass Sie das beste Werkzeug für den Job auswählen können. Sie können beispielsweise eine ganze Datei auf einmal laden oder Zeile für Zeile in den Speicher streamen. In den meisten Fällen können Sie zwischen synchronen und asynchronen Ansätzen wählen.

Dieser Artikel zeigt, wie die verschiedenen Dateioperationen durchgeführt werden – Erstellen, Lesen, Aktualisieren, Löschen und Suchen – einschließlich der verschiedenen Ansätze.

Erstellen Sie eine neue Textdatei

Sie können System.IO.File.WriteAllText() verwenden, um eine neue Textdatei wie folgt zu erstellen:

StringBuilder sb = new StringBuilder();
sb.AppendLine("We the People of the United States, ");
sb.AppendLine("in Order to form a more perfect Union, ");
sb.AppendLine("establish Justice, insure domestic Tranquility, ");
sb.AppendLine("provide for the common defense, promote the general Welfare, ");
sb.AppendLine("and secure the Blessings of Liberty to ourselves and our Posterity, ");
sb.AppendLine("do ordain and establish this Constitution for the United States of America.");

var constitution = sb.ToString();

System.IO.File.WriteAllText(path: @"C:\temp\AmericanConstitution.txt", contents: constitution);
Code language: C# (cs)

Die asynchrone Version ist System.IO.File.WriteAllTextAsync().

static async Task Main(string[] args)
{
	await System.IO.File.WriteAllTextAsync(path: @"C:\temp\hello.txt", contents: "hello world");
}
Code language: C# (cs)

Hinweis:Wenn die Datei bereits existiert, wird sie überschrieben.

Eine Textdatei auf einmal lesen

Wenn Ihre Datei klein ist, können Sie sie auf einmal in den Speicher einlesen. Sie können entweder den gesamten Text in einen einzigen String einlesen oder jede Zeile als String in ein Array laden.

Lesen Sie den gesamten Text in eine einzige Zeichenfolge ein

Um eine Textdatei in einen String einzulesen, verwenden Sie System.IO.File.ReadAllText() wie folgt:

var constitution = System.IO.File.ReadAllText(path: @"C:\temp\AmericanConstitution.txt");
Console.WriteLine(constitution);
Code language: C# (cs)

Die asynchrone Version ist System.IO.File.ReadAllTextAsync().

static async Task Main(string[] args)
{
	var hello = await System.IO.File.ReadAllTextAsync(path: @"C:\temp\hello.txt");
}
Code language: C# (cs)

Lesen Sie den gesamten Text mit jeder Zeile als Zeichenfolge in einem Array

Um die Textdatei in ein String-Array zu laden, in dem jede Zeile ein separater String im Array ist, verwenden Sie System.IO.File.ReadAllLines() wie folgt:

var constitution = System.IO.File.ReadAllLines(path: @"C:\temp\AmericanConstitution.txt");
foreach(var line in constitution)
{
	Console.WriteLine(line);
}
Code language: C# (cs)

Die asynchrone Version ist System.IO.File.ReadAllLinesAsync().

var helloLines = await System.IO.File.ReadAllLinesAsync(path: @"C:\temp\hello.txt");
foreach(var line in helloLines)
{
	Console.WriteLine(line);
}
Code language: C# (cs)

Eine Textdatei Zeile für Zeile lesen

Dieser Ansatz streamt die Datei Zeile für Zeile in den Speicher, anstatt sie auf einmal zu lesen. Verwenden Sie diesen Ansatz, wenn Sie eine große Datei lesen (um OutOfMemoryException zu vermeiden) oder wenn Sie nur vorwärts lesen (wobei Sie sich jeweils nur um eine Zeile kümmern und die Zeile danach nicht mehr benötigen ).

Verwenden Sie System.IO.File.ReadLines(), um eine Datei Zeile für Zeile in einem Streaming-Verfahren zu lesen. Dies ist eine nette High-Level-Methode, die die Tatsache abstrahiert, dass sie einen StreamReader verwendet.

foreach(var line in System.IO.File.ReadLines(path: @"C:\temp\AmericanConstitution.txt"))
{
	Console.WriteLine(line);
}Code language: PHP (php)

Es gibt keine einfache, direkte asynchrone Version von ReadLines(). Es macht keinen Sinn, einzelne Zeilen asynchron zu lesen. Ich sehe keinen Grund, warum Sie das tun möchten, und es ist definitiv ein Performance-Hit beteiligt. Wenn Sie Zeilen jedoch wirklich asynchron lesen möchten, können Sie versuchen, StreamReader zu verwenden.

Aktualisieren Sie eine Textdatei durch Anhängen am Ende

Sie können System.IO.File.AppendAllText() verwenden, um an das Ende einer Datei anzuhängen.

StringBuilder sb = new StringBuilder();
sb.AppendLine("Article 1");
sb.AppendLine("Section 1");
sb.AppendLine("All legislative Powers herein granted shall be vested in a Congress of the United States, ");
sb.AppendLine("which shall consist of a Senate and House of Representatives.");

var constitution = sb.ToString();

System.IO.File.AppendAllText(path: @"C:\temp\AmericanConstitution.txt", contents: constitution);
Code language: C# (cs)

Die asynchrone Version ist System.IO.File.AppendAllTextAsync().

static async Task Main(string[] args)
{
	await System.IO.File.AppendAllTextAsync(path: @"C:\temp\hello.txt", contents: "bye");
}
Code language: C# (cs)

Hinweis:Wenn die Datei nicht existiert, wird sie hiermit erstellt.

Wie füge ich irgendwo in die Datei ein?

Sie fragen sich vielleicht, wie ich Text irgendwo einfügen kann, anstatt ihn einfach an das Ende der Datei anzuhängen? Beispielsweise möchten Sie möglicherweise Text am Anfang der Datei voranstellen oder Text in der Mitte der Datei ändern.

Es gibt keinen einfachen API-Aufruf auf hoher Ebene, mit dem Sie dies tun können.

Dateien sind wie Arrays. Wollte man ein neues Element in die Mitte des Arrays einfügen, müsste man alle Elemente um eins nach rechts verschieben. Es ist das gleiche Konzept mit Dateien. Sie müssen alle vorhandenen Daten verschieben, um sie an beliebiger Stelle in die Datei einfügen zu können. Dies wird besonders schwierig, wenn Sie es mit großen Dateien zu tun haben. Dieser Algorithmus wird Gegenstand eines zukünftigen Artikels sein.

Eine Textdatei löschen

Sie können System.IO.File.Delete() verwenden, um eine Datei zu löschen. Das ist einfach:

System.IO.File.Delete(path: @"C:\temp\AmericanConstitution.txt");
Code language: C# (cs)

Es gibt keine asynchrone Version davon.

Suchen nach Dateien in einem Verzeichnis

Sie können System.IO.Directory.EnumerateFiles() verwenden, um nach Dateien in einem Verzeichnis zu suchen. Dies hat viele Überladungen, mit denen Sie genau angeben können, was Sie wollen. Sie können nur das aktuelle Verzeichnis durchsuchen, alle Unterverzeichnisse durchsuchen, Dateien nach Namen (einschließlich Erweiterung) filtern und nach Attributen filtern. Hier sind einige Szenarien.

Alle Dateien in einem Verzeichnis abrufen

Dies gibt alle Dateien im Verzeichnis der obersten Ebene zurück.

foreach (var file in System.IO.Directory.EnumerateFiles(@"C:\temp\"))
{
	Console.WriteLine(file);
}
Code language: C# (cs)

Alle Dateien im Verzeichnis und allen Unterverzeichnissen erhalten

Dies gibt alle Dateien aus dem angegebenen Verzeichnis und allen seinen Unterverzeichnissen zurück.

foreach (var file in System.IO.Directory.EnumerateFiles(@"C:\temp\", "*", SearchOption.AllDirectories))
{
	Console.WriteLine(file);
}
Code language: C# (cs)

Alle JSON-Dateien im Verzeichnis abrufen

Sie können ein Suchmuster anwenden, mit dem Sie Dateien nach Name und Erweiterung filtern können. Im Folgenden wird nach allen Dateien mit der Erweiterung .json gesucht.

foreach (var file in System.IO.Directory.EnumerateFiles(@"C:\temp\", "*.json"))
{
	Console.WriteLine(file);
}
Code language: C# (cs)

Alle Dateien abrufen, die nicht schreibgeschützt sind

Sie können ein EnumerationOptions-Objekt übergeben, um Dateien basierend auf Attributen herauszufiltern. Das folgende Beispiel sucht beispielsweise nach allen JSON-Dateien und filtert diejenigen heraus, die schreibgeschützt sind.

foreach (var file in System.IO.Directory.EnumerateFiles(@"C:\temp\", "*.json",
 new EnumerationOptions() { AttributesToSkip = FileAttributes.ReadOnly }))
{
	Console.WriteLine(file);
}
Code language: C# (cs)

AttributesToSkip ist ein Enum-Flag, sodass Sie alle Attribute, die Sie herausfiltern möchten, mit ODER verknüpfen können. Angenommen, Sie möchten versteckte Dateien und schreibgeschützte Dateien herausfiltern. Sie würden Folgendes verwenden:

new EnumerationOptions() 
{ 
	AttributesToSkip = FileAttributes.ReadOnly | FileAttributes.Hidden 
}
Code language: C# (cs)