AYUDA .NET

FileStream C# (Cómo funciona para desarrolladores)

Kannaopat Udonpant
Kannapat Udonpant
24 de octubre, 2024
Compartir:

Este artículo se centra enClase FileStream en C# y cómo ayuda a realizar operaciones de lectura y escritura en archivos. Exploraremos ejemplos prácticos, comprenderemos el funcionamiento básico de FileStream y aprenderemos a gestionar los datos de archivos de forma eficaz. Esta guía está dirigida a los que se inician en el manejo de archivos en C#, por lo que el lenguaje seguirá siendo fácil de entender para los principiantes, a la vez que se ofrecen instrucciones detalladas sobre cómo trabajar con archivos en C# y una introducción a las herramientas de gestión de archivosBiblioteca IronPDF también.

¿Qué es FileStream?

La clase FileStream de C# permite manejar archivos mediante bytes. Funciona con operaciones de lectura y escritura de archivos, lo que permite interactuar directamente con el contenido de los archivos. Esto es particularmente útil cuando se trabaja con archivos para tareas de entrada/salida, especialmente cuando se manipulan matrices de bytes.

Casos de uso de FileStream

FileStream es ideal para:

  • Lectura y escritura de datos binarios directamente desde o hacia archivos.
  • Manejo eficaz de archivos de gran tamaño.
  • Realización de operaciones de archivo asíncronas.
  • Gestión de los recursos del sistema mediante el uso eficiente de la memoria.

Ejemplo básico

He aquí un ejemplo sencillo para abrir un archivo, escribir datos y luego leerlos utilizando FileStream:

using System;
using System.IO;
public static void Main()
{
    string path = "example.txt";
    // Creating a FileStream object to handle the file. The file handle is acquired here.
    using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write))
    {
        byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello, FileStream!");
        fileStream.Write(data, 0, data.Length);
    }
    // Read from the file
    using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
    {
        byte[] buffer = new byte[1024];
        int bytesRead = fileStream.Read(buffer, 0, buffer.Length);
        string text = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
        Console.WriteLine(text);
    }
}
using System;
using System.IO;
public static void Main()
{
    string path = "example.txt";
    // Creating a FileStream object to handle the file. The file handle is acquired here.
    using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write))
    {
        byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello, FileStream!");
        fileStream.Write(data, 0, data.Length);
    }
    // Read from the file
    using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
    {
        byte[] buffer = new byte[1024];
        int bytesRead = fileStream.Read(buffer, 0, buffer.Length);
        string text = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
        Console.WriteLine(text);
    }
}

Este ejemplo muestra la creación de un objeto FileStream para gestionar operaciones de lectura y escritura de archivos. La clase FileStream lee y escribe bytes directamente, lo que la hace adecuada para manejar archivos grandes o datos binarios. Utilizamos Encoding para convertir entre texto y bytes.

Escribir datos con FileStream

Para escribir datos en un archivo, utilizarás el método Write. Aquí tienes un ejemplo que explica cómo funciona con más detalle:

using System;
using System.IO;
public static void Main()
{
    string path = "output.txt";
    using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write))
    {
        byte[] buffer = System.Text.Encoding.UTF8.GetBytes("Writing data to FileStream.");
        int offset = 0;
        int count = buffer.Length;
        // Writing data to the file
        fileStream.Write(buffer, offset, count);
    }
}
using System;
using System.IO;
public static void Main()
{
    string path = "output.txt";
    using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write))
    {
        byte[] buffer = System.Text.Encoding.UTF8.GetBytes("Writing data to FileStream.");
        int offset = 0;
        int count = buffer.Length;
        // Writing data to the file
        fileStream.Write(buffer, offset, count);
    }
}

En este código, convertimos una cadena en una matriz de bytes utilizando la codificación UTF8. El método Write escribe la matriz de bytes en el archivo a partir de la posición actual(determinado por la compensación) y escribiendo el número especificado de bytes.

  • FileMode.Create crea un nuevo archivo, sobrescribiendo cualquier archivo existente con el mismo nombre.
  • FileAccess.Write concede permisos de escritura al FileStream.

Lectura de datos con FileStream

Ahora, vamos a explorar cómo leer datos de un archivo utilizando FileStream.

using System;
using System.IO;
public static void Main()
{
    // File path
    string path = "output.txt";
    // File Stream Object
    using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
    {
        byte[] buffer = new byte[1024];
        int bytesRead = fileStream.Read(buffer, 0, buffer.Length);
    // Output Stream
        string output = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
        Console.WriteLine(output);
    }
}
using System;
using System.IO;
public static void Main()
{
    // File path
    string path = "output.txt";
    // File Stream Object
    using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
    {
        byte[] buffer = new byte[1024];
        int bytesRead = fileStream.Read(buffer, 0, buffer.Length);
    // Output Stream
        string output = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
        Console.WriteLine(output);
    }
}

En este ejemplo:

  • FileMode.Open abre un archivo existente.
  • El método Read lee un número determinado de bytes(en función del tamaño del búfer) y los almacena en el búfer de matriz de bytes.
  • Utilizamos Encoding.UTF8.GetString para convertir los datos de bytes en una cadena.

Gestión del acceso a archivos con FileStream

La clase FileStream controla el acceso a los archivos, lo que permite un manejo preciso de los mismos y la gestión de los recursos del sistema. Cuando se utiliza FileStream, es vital asegurarse de que el flujo se elimina correctamente después de su uso, ya sea llamando a Close() manualmente o utilizando la sentencia que elimina automáticamente el flujo.

Manejo de la posición del archivo

Cada vez que lees o escribes en un archivo, FileStream mantiene un registro de la posición actual dentro del archivo. Puedes acceder a esta posición utilizando la propiedad Position:

fileStream.Position = 0; // Move to the beginning of the file
fileStream.Position = 0; // Move to the beginning of the file

Uso de FileStream para operaciones asíncronas

FileStream puede utilizarse para operaciones asíncronas de lectura y escritura, lo que mejora el rendimiento al permitir que se ejecuten otros procesos mientras se realizan las operaciones de archivo. He aquí un ejemplo básico de lectura asíncrona:

using System;
using System.IO;
using System.Threading.Tasks;
public static async Task Main()
{
    // Specified Path
    string path = "output.txt";
    using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None, 4096, true))
    {
        byte[] buffer = new byte[1024];
        int bytesRead = await fileStream.ReadAsync(buffer, 0, buffer.Length);
        string result = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
        Console.WriteLine(result);
    }
}
using System;
using System.IO;
using System.Threading.Tasks;
public static async Task Main()
{
    // Specified Path
    string path = "output.txt";
    using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None, 4096, true))
    {
        byte[] buffer = new byte[1024];
        int bytesRead = await fileStream.ReadAsync(buffer, 0, buffer.Length);
        string result = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);
        Console.WriteLine(result);
    }
}

El método ReadAsync lee los datos de forma asíncrona. Los parámetros FileAccess.Read y FileMode.Open controlan cómo se accede al archivo.

Ejemplo de manejo de excepciones

Cuando se trabaja con FileStream, el manejo de excepciones es esencial para evitar errores en tiempo de ejecución y gestionar adecuadamente los recursos del sistema. He aquí un patrón para manejar excepciones al leer o escribir en archivos:

using System;
using System.IO;
public static void Main()
{
    string path = "nonexistentfile.txt";
    try
    {
        using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
        {
            byte[] buffer = new byte[1024];
            int bytesRead = fileStream.Read(buffer, 0, buffer.Length);
            Console.WriteLine("Bytes Read: " + bytesRead);
        }
    }
    catch (FileNotFoundException e)
    {
        Console.WriteLine($"Exception: {e.Message}");
    }
}
using System;
using System.IO;
public static void Main()
{
    string path = "nonexistentfile.txt";
    try
    {
        using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
        {
            byte[] buffer = new byte[1024];
            int bytesRead = fileStream.Read(buffer, 0, buffer.Length);
            Console.WriteLine("Bytes Read: " + bytesRead);
        }
    }
    catch (FileNotFoundException e)
    {
        Console.WriteLine($"Exception: {e.Message}");
    }
}

Almacenamiento en búfer y rendimiento

La clase FileStream incluye un mecanismo de almacenamiento en búfer que permite un rendimiento más rápido, especialmente cuando se trabaja con archivos de gran tamaño. Mediante un búfer, los datos se almacenan temporalmente en la memoria, lo que reduce la necesidad de acceder constantemente al disco.

using System;
using System.IO;
public static void Main()
{
    string path = "bufferedfile.txt";
    byte[] data = System.Text.Encoding.UTF8.GetBytes("Buffered FileStream example.");
    using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None, 4096, FileOptions.WriteThrough))
    {
        fileStream.Write(data, 0, data.Length);
    }
}
using System;
using System.IO;
public static void Main()
{
    string path = "bufferedfile.txt";
    byte[] data = System.Text.Encoding.UTF8.GetBytes("Buffered FileStream example.");
    using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None, 4096, FileOptions.WriteThrough))
    {
        fileStream.Write(data, 0, data.Length);
    }
}

En este caso, FileOptions.WriteThrough garantiza que los datos se escriban directamente en el archivo, evitando el almacenamiento en búfer adicional. Sin embargo, se puede controlar el tamaño del búfer para ajustar el rendimiento.

Presentación de IronPDF

FileStream C#(Cómo funciona para desarrolladores): Figura 1 - IronPDF: La biblioteca PDF de C#

IronPDF es una robusta biblioteca PDF en C# para crear, editar y manipular documentos PDF dentro de aplicaciones .NET. Los desarrolladores puedengenerar archivos PDF a partir de varias entradas, como HTMLademás, IronPDF permite traducir archivos de texto, imágenes e incluso texto sin formato. Con funciones como marcas de agua, fusión, división y protección por contraseña, IronPDF es ideal para aplicaciones web y de escritorio con un control preciso sobre el resultado PDF.

IronPDF con FileStream

He aquí un ejemplo de generación de un PDF utilizando IronPDF y guardándolo en un FileStream. Esto demuestra cómo IronPDF se integra sin problemas con FileStream, permitiendo a los desarrolladores controlar mediante programación la creación y el almacenamiento de archivos PDF.

using System;
using System.IO;
using IronPdf;
public static void Main()
{
    // Define the file path
    string path = "output.pdf";
    // Create an HTML string that we want to convert to PDF
    var htmlContent = "<h1>IronPDF Example</h1><p>This PDF was generated using IronPDF and saved with FileStream.</p>";
    // Initialize IronPDF's ChromePdfRenderer to render HTML as PDF
    var renderer = new ChromePdfRenderer();
    // Generate the PDF from the HTML string
    var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
    // Use FileStream to save the generated PDF
    using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write))
    {
        pdfDocument.SaveAs(fileStream);
    }
    Console.WriteLine("PDF created and saved successfully.");
}
using System;
using System.IO;
using IronPdf;
public static void Main()
{
    // Define the file path
    string path = "output.pdf";
    // Create an HTML string that we want to convert to PDF
    var htmlContent = "<h1>IronPDF Example</h1><p>This PDF was generated using IronPDF and saved with FileStream.</p>";
    // Initialize IronPDF's ChromePdfRenderer to render HTML as PDF
    var renderer = new ChromePdfRenderer();
    // Generate the PDF from the HTML string
    var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
    // Use FileStream to save the generated PDF
    using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write))
    {
        pdfDocument.SaveAs(fileStream);
    }
    Console.WriteLine("PDF created and saved successfully.");
}

Conclusión

FileStream C#(Cómo funciona para desarrolladores): Figura 2 - Página de licencias de IronPDF

La clase FileStream en C# ofrece una potente funcionalidad para gestionar la entrada y salida de archivos. Permite a los desarrolladores leer y escribir datos de forma eficiente, controlar la posición actual dentro de un archivo y trabajar de forma asíncrona mediante la comprensión de cómo funcionan conjuntamente las matrices de bytes, las rutas de archivos y la gestión de flujos. El uso de FileStream en combinación con IronPDF proporciona a los desarrolladores la flexibilidad necesaria para gestionar archivos PDF de forma eficaz en aplicaciones .NET. Ya se trate de generar informes, guardar archivos o manejar contenido dinámico, esta combinación ofrece un control preciso sobre la creación y el almacenamiento de documentos PDF.

IronPDF ofrece unprueba gratuitay una tarifa de licencia $749, convirtiéndolo en una solución competitiva para las necesidades de generación profesional de PDF.

Kannaopat Udonpant
Ingeniero de software
Antes de convertirse en ingeniero de software, Kannapat realizó un doctorado en Recursos Medioambientales en la Universidad de Hokkaido (Japón). Mientras cursaba su licenciatura, Kannapat también se convirtió en miembro del Laboratorio de Robótica Vehicular, que forma parte del Departamento de Ingeniería de Bioproducción. En 2022, aprovechó sus conocimientos de C# para unirse al equipo de ingeniería de Iron Software, donde se centra en IronPDF. Kannapat valora su trabajo porque aprende directamente del desarrollador que escribe la mayor parte del código utilizado en IronPDF. Además del aprendizaje entre iguales, Kannapat disfruta del aspecto social de trabajar en Iron Software. Cuando no está escribiendo código o documentación, Kannapat suele jugar con su PS5 o volver a ver The Last of Us.
< ANTERIOR
C# Initialize List (Cómo funciona para desarrolladores)
SIGUIENTE >
Palabra clave C# Init (Cómo funciona para desarrolladores)