Operaciones de archivos en .NET:crear, leer, actualizar, eliminar y buscar

 C Programming >> Programación C >  >> Tags >> .NET
Operaciones de archivos en .NET:crear, leer, actualizar, eliminar y buscar

.NET tiene una buena API de archivos de alto nivel que abstrae la complejidad de las operaciones con archivos. Puede crear, leer, actualizar, eliminar y buscar archivos con una única llamada de método.

Es flexible y proporciona múltiples enfoques, lo que le permite elegir la mejor herramienta para el trabajo. Por ejemplo, puede cargar un archivo completo de una sola vez o transferirlo a la memoria línea por línea. En la mayoría de los casos, puede elegir entre enfoques sincrónicos y asincrónicos.

Este artículo muestra cómo realizar las diferentes operaciones de archivo (crear, leer, actualizar, eliminar y buscar), incluidos los diferentes enfoques.

Crear un nuevo archivo de texto

Puede usar System.IO.File.WriteAllText() para crear un nuevo archivo de texto como este:

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)

La versión asíncrona es 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)

Nota:si el archivo ya existe, lo sobrescribe.

Leer un archivo de texto de una sola vez

Si su archivo es pequeño, puede leerlo en la memoria de una sola vez. Puede leer todo el texto en una sola cadena o cargar cada línea como una cadena en una matriz.

Leer todo el texto en una sola cadena

Para leer un archivo de texto en una cadena, use System.IO.File.ReadAllText(), así:

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

La versión asíncrona es 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)

Lea todo el texto con cada línea como una cadena en una matriz

Para cargar el archivo de texto en una matriz de cadenas, donde cada línea es una cadena separada en la matriz, use System.IO.File.ReadAllLines() así:

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

La versión asíncrona es 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)

Leer un archivo de texto línea por línea

Este enfoque transmite el archivo a la memoria línea por línea, en lugar de leerlo todo a la vez. Use este enfoque si está leyendo un archivo grande (para evitar la excepción OutOfMemoryException) o si está haciendo una lectura de solo hacia adelante (donde solo le importa una línea a la vez y no necesita que la línea se quede después). ).

Use System.IO.File.ReadLines() para leer un archivo línea por línea de forma continua. Este es un buen método de alto nivel que abstrae el hecho de que está usando un StreamReader.

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

No existe una versión asíncrona simple y directa de ReadLines(). No tiene sentido leer líneas individuales de manera asíncrona. No puedo ver una razón por la que querrías hacer eso, y definitivamente hay un impacto en el rendimiento involucrado. Sin embargo, si realmente desea leer líneas de forma asíncrona, puede intentar usar StreamReader.

Actualiza un archivo de texto agregándolo al final

Puede usar System.IO.File.AppendAllText() para agregar al final de un archivo.

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)

La versión asíncrona es 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)

Nota:si el archivo no existe, esto lo crea.

¿Cómo inserto en cualquier parte del archivo?

Quizás se pregunte, ¿cómo inserto texto en cualquier lugar, en lugar de simplemente agregarlo al final del archivo? Por ejemplo, es posible que desee anteponer texto al comienzo del archivo o modificar el texto en el medio del archivo.

No existe una llamada API simple y de alto nivel que le permita hacer esto.

Los archivos son como matrices. Si quisiera insertar un nuevo elemento en el medio de la matriz, tendría que desplazar todos los elementos a la derecha en uno. Es el mismo concepto con los archivos. Tienes que desplazar todos los datos existentes para poder insertarlos en cualquier parte del archivo. Esto se vuelve especialmente difícil si se trata de archivos grandes. Este algoritmo será objeto de un artículo futuro.

Eliminar un archivo de texto

Puede usar System.IO.File.Delete() para eliminar un archivo. Esto es sencillo:

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

No hay una versión asíncrona de esto.

Buscando archivos en un directorio

Puede usar System.IO.Directory.EnumerateFiles() para buscar archivos en un directorio. Esto tiene muchas sobrecargas, lo que te permite especificar exactamente lo que quieres. Puede buscar solo en el directorio actual, buscar en todos los subdirectorios, filtrar archivos por nombre (incluida la extensión) y filtrar por atributos. Aquí hay algunos escenarios.

Obtener todos los archivos en un directorio

Esto devuelve todos los archivos en el directorio de nivel superior.

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

Obtenga todos los archivos en el directorio y todos los subdirectorios

Esto devuelve todos los archivos del directorio especificado y todos sus subdirectorios.

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

Obtener todos los archivos JSON en el directorio

Puede aplicar un patrón de búsqueda que le permite filtrar archivos por nombre y extensión. Lo siguiente busca todos los archivos con la extensión .json.

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

Obtener todos los archivos que no son de solo lectura

Puede pasar un objeto EnumerationOptions para filtrar archivos según los atributos. Por ejemplo, lo siguiente busca todos los archivos JSON y filtra los que son de solo lectura.

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

AttributesToSkip es un indicador de enumeración, por lo que puede O juntar todos los atributos que desea filtrar. Por ejemplo, supongamos que desea filtrar archivos ocultos y archivos de solo lectura. Usarías lo siguiente:

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