
FileStream C# (Cómo Funciona para Desarrolladores)
Este artículo se centrará en la clase FileStream en C# y cómo te ayuda a realizar operaciones de lectura y escritura en archivos. Exploraremos ejemplos prácticos, entenderemos cómo funciona FileStream en su núcleo, y aprenderemos cómo gestionar datos de archivos de manera eficiente. Esta guía está dirigida a aquellos que son nuevos en el manejo de archivos en C#, por lo que el lenguaje se mantendrá accesible para principiantes al tiempo que proporciona instrucciones detalladas sobre cómo trabajar con archivos en C# y una introducción a la biblioteca IronPDF también.
¿Qué es FileStream?
La clase FileStream en C# proporciona una forma de manejar archivos usando bytes. Funciona con operaciones de lectura y escritura en archivos, permitiéndote interactuar directamente con el contenido de los archivos. Esto es particularmente útil al trabajar con archivos para tareas de entrada/salida, especialmente al manipular matrices de bytes.
Casos de uso de FileStream
FileStream es ideal para:
- Leer y escribir datos binarios directamente desde o hacia archivos.
- Manejar archivos grandes de manera eficiente.
- Realizar operaciones de archivos asincrónicas.
- Gestionar recursos del sistema utilizando eficientemente la memoria.
Ejemplo básico
Aquí hay un ejemplo simple para abrir un archivo, escribir datos y luego leerlos usando FileStream:
using System;
using System.IO;
public class Example
{
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!");
// Write data to file
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);
}
}
}Imports System
Imports System.IO
Public Class Example
Public Shared Sub Main()
Dim path As String = "example.txt"
' Creating a FileStream object to handle the file. The file handle is acquired here.
Using fileStream As New FileStream(path, FileMode.Create, FileAccess.Write)
Dim data As Byte() = System.Text.Encoding.UTF8.GetBytes("Hello, FileStream!")
' Write data to file
fileStream.Write(data, 0, data.Length)
End Using
' Read from the file
Using fileStream As New FileStream(path, FileMode.Open, FileAccess.Read)
Dim buffer As Byte() = New Byte(1023) {}
Dim bytesRead As Integer = fileStream.Read(buffer, 0, buffer.Length)
Dim text As String = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead)
Console.WriteLine(text)
End Using
End Sub
End ClassEste ejemplo demuestra cómo crear un objeto FileStream para manejar operaciones de lectura y escritura de archivos. La clase FileStream lee y escribe bytes directamente, haciéndola 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, usarás el método Write. Aquí hay un ejemplo que explica cómo funciona con más detalle:
using System;
using System.IO;
public class FileWriteExample
{
public static void Main()
{
string path = "output.txt";
// Creating a FileStream object to write data to the file
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);
}
}
}Imports System
Imports System.IO
Public Class FileWriteExample
Public Shared Sub Main()
Dim path As String = "output.txt"
' Creating a FileStream object to write data to the file
Using fileStream As New FileStream(path, FileMode.Create, FileAccess.Write)
Dim buffer As Byte() = System.Text.Encoding.UTF8.GetBytes("Writing data to FileStream.")
Dim offset As Integer = 0
Dim count As Integer = buffer.Length
' Writing data to the file
fileStream.Write(buffer, offset, count)
End Using
End Sub
End ClassEn 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 comenzando desde la posición actual (determinada por el desplazamiento) y escribiendo la cantidad especificada de bytes.
- FileMode.Create crea un nuevo archivo, sobrescribiendo cualquier archivo existente con el mismo nombre.
- FileAccess.Write otorga permisos de escritura al FileStream.
Lectura de datos con FileStream
Ahora, exploremos cómo leer datos de un archivo usando FileStream.
using System;
using System.IO;
public class FileReadExample
{
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);
}
}
}Imports System
Imports System.IO
Public Class FileReadExample
Public Shared Sub Main()
' File path
Dim path As String = "output.txt"
' File Stream Object
Using fileStream As New FileStream(path, FileMode.Open, FileAccess.Read)
Dim buffer(1023) As Byte
Dim bytesRead As Integer = fileStream.Read(buffer, 0, buffer.Length)
' Output Stream
Dim output As String = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead)
Console.WriteLine(output)
End Using
End Sub
End ClassEn este ejemplo:
- FileMode.Open abre un archivo existente.
- El método Read lee una cantidad específica de bytes (basada en el tamaño del buffer) y los almacena en el buffer de matriz de bytes.
- Utilizamos
Encoding.UTF8.GetStringpara convertir los datos de bytes de nuevo a una cadena.
Gestión del acceso a archivos con FileStream
La clase FileStream controla el acceso a los archivos, permitiendo un manejo fino de los manejadores de archivos y la gestión de recursos del sistema. Al usar FileStream, es vital asegurarse de que el flujo se deseche correctamente después de usarlo, ya sea llamando a Close() manualmente o utilizando la instrucción using que automáticamente desecha el flujo.
Cómo manejar la posición de un archivo
Cada vez que lees o escribes en un archivo, FileStream lleva un registro de la posición actual dentro del archivo. Puedes acceder a esta posición usando la propiedad Position:
fileStream.Position = 0; // Move to the beginning of the filefileStream.Position = 0 ' Move to the beginning of the fileUso de FileStream para operaciones asíncronas
FileStream se puede usar para operaciones de lectura y escritura asíncronas, mejorando el rendimiento al permitir que otros procesos se ejecuten mientras se realizan las operaciones de archivo. Aquí hay un ejemplo básico de lectura asíncrona:
using System;
using System.IO;
using System.Threading.Tasks;
public class AsyncReadExample
{
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);
}
}
}Imports System
Imports System.IO
Imports System.Threading.Tasks
Public Class AsyncReadExample
Public Shared Async Function Main() As Task
' Specified Path
Dim path As String = "output.txt"
Using fileStream As New FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None, 4096, True)
Dim buffer(1023) As Byte
Dim bytesRead As Integer = Await fileStream.ReadAsync(buffer, 0, buffer.Length)
Dim result As String = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead)
Console.WriteLine(result)
End Using
End Function
End ClassEl método ReadAsync lee los datos de manera asincrónica. Los parámetros FileAccess.Read y FileMode.Open controlan cómo se accede al archivo.
Ejemplo de manejo de excepciones
Al trabajar con FileStream, manejar excepciones es esencial para evitar errores de ejecución y gestionar correctamente los recursos del sistema. Aquí hay un patrón para manejar excepciones al leer o escribir en archivos:
using System;
using System.IO;
public class ExceptionHandlingExample
{
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}");
}
}
}Imports System
Imports System.IO
Public Class ExceptionHandlingExample
Public Shared Sub Main()
Dim path As String = "nonexistentfile.txt"
Try
Using fileStream As New FileStream(path, FileMode.Open, FileAccess.Read)
Dim buffer(1023) As Byte
Dim bytesRead As Integer = fileStream.Read(buffer, 0, buffer.Length)
Console.WriteLine("Bytes Read: " & bytesRead)
End Using
Catch e As FileNotFoundException
Console.WriteLine($"Exception: {e.Message}")
End Try
End Sub
End ClassBuffering y rendimiento
La clase FileStream incluye un mecanismo de almacenamiento intermedio que permite un rendimiento más rápido, especialmente al trabajar con archivos grandes. Usando un buffer, los datos se almacenan temporalmente en la memoria, reduciendo la necesidad de acceso constante al disco.
using System;
using System.IO;
public class BufferingExample
{
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);
}
}
}Imports System
Imports System.IO
Public Class BufferingExample
Public Shared Sub Main()
Dim path As String = "bufferedfile.txt"
Dim data As Byte() = System.Text.Encoding.UTF8.GetBytes("Buffered FileStream example.")
Using fileStream As New FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None, 4096, FileOptions.WriteThrough)
fileStream.Write(data, 0, data.Length)
End Using
End Sub
End ClassAquí, FileOptions.WriteThrough asegura que los datos se escriban directamente en el archivo, omitiendo el almacenamiento en búfer adicional. Sin embargo, puedes controlar el tamaño del buffer para ajustar el rendimiento.
Presentando IronPDF

IronPDF es una robusta biblioteca PDF en C# para crear, editar y manipular documentos PDF dentro de aplicaciones .NET. Los desarrolladores pueden generar PDFs desde varias entradas como HTML, imágenes, e incluso texto sin formato usando IronPDF. Con características como marcas de agua, combinación, división, y protección con contraseña, IronPDF es ideal para aplicaciones web y de escritorio con control preciso sobre la salida PDF.
IronPDF con FileStream
Aquí hay un ejemplo de generación de un PDF usando IronPDF y guardándolo en un FileStream. Esto demuestra cómo IronPDF se integra sin problemas con FileStream, permitiendo a los desarrolladores controlar programáticamente la creación y el guardado de PDFs.
using System;
using System.IO;
using IronPdf;
public class IronPDFExample
{
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.");
}
}Imports System
Imports System.IO
Imports IronPdf
Public Class IronPDFExample
Public Shared Sub Main()
' Define the file path
Dim path As String = "output.pdf"
' Create an HTML string that we want to convert to PDF
Dim 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
Dim renderer = New ChromePdfRenderer()
' Generate the PDF from the HTML string
Dim pdfDocument = renderer.RenderHtmlAsPdf(htmlContent)
' Use FileStream to save the generated PDF
Using fileStream As New FileStream(path, FileMode.Create, FileAccess.Write)
pdfDocument.SaveAs(fileStream)
End Using
Console.WriteLine("PDF created and saved successfully.")
End Sub
End ClassConclusión
La clase FileStream en C# ofrece una funcionalidad poderosa para gestionar la entrada y salida de archivos. Permite a los desarrolladores leer y escribir datos de manera eficiente, controlar la posición actual dentro de un archivo, y trabajar de manera asíncrona al entender cómo funcionan juntos las matrices de bytes, las rutas de archivos y el manejo de flujos. Usar FileStream en combinación con IronPDF proporciona a los desarrolladores la flexibilidad para manejar PDFs de manera eficiente dentro de aplicaciones .NET. Ya sea que estés generando informes, guardando archivos o manejando contenido dinámico, esta combinación ofrece un control detallado sobre la creación y almacenamiento de documentos PDF.
IronPDF ofrece una prueba gratuita y una tasa de licencia $999, lo que la convierte en una solución competitiva para las necesidades profesionales de generación de PDF.

Jacob Mellor es Director de Tecnología de Iron Software y un ingeniero visionario pionero en la tecnología C# PDF. Como desarrollador original de la base de código principal de Iron Software, ha dado forma a la arquitectura de productos de la empresa desde su creación, transformándola, junto con el director ejecutivo Cameron Rimington, en una empresa de más de 50 personas que presta servicios a la NASA, Tesla y organismos gubernamentales de todo el mundo.
Artículos Relacionados


