E/S de Archivos
## Objetivos de Aprendizaje
- Leer y escribir archivos de texto
- Usar StreamReader y StreamWriter
- Trabajar con rutas de archivos
- Manejar operaciones de archivos de forma segura
## Clase File (Métodos Estáticos)
### Operaciones Simples
```csharp
using System.IO;
// Leer todo el texto
string content = File.ReadAllText("file.txt");
// Escribir todo el texto
File.WriteAllText("output.txt", "Hello, World!");
// Leer todas las líneas
string[] lines = File.ReadAllLines("file.txt");
// Escribir todas las líneas
File.WriteAllLines("output.txt", new[] { "Línea 1", "Línea 2" });
```
### Métodos de File
```csharp
File.Exists("file.txt"); // Verificar si existe
File.Copy("source.txt", "dest.txt"); // Copiar
File.Copy("source.txt", "dest.txt", true); // Sobrescribir
File.Move("source.txt", "dest.txt"); // Mover/Renombrar
File.Delete("file.txt"); // Eliminar
File.GetCreationTime("file.txt"); // Fecha de creación
File.GetLastWriteTime("file.txt"); // Fecha de modificación
File.GetLastAccessTime("file.txt"); // Fecha de acceso
```
## StreamReader
### Leer Texto
```csharp
using System.IO;
// Leer archivo completo
using (StreamReader reader = new StreamReader("file.txt"))
{
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
// Leer línea por línea
using (StreamReader reader = new StreamReader("file.txt"))
{
string? line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
// Leer carácter único
using (StreamReader reader = new StreamReader("file.txt"))
{
int c = reader.Read(); // Devuelve int, -1 al final del archivo
}
```
### Métodos de StreamReader
```csharp
reader.Peek(); // Mirar siguiente char sin consumir
reader.Read(); // Leer carácter único
reader.ReadLine(); // Leer hasta nueva línea
reader.ReadToEnd(); // Leer resto del archivo
reader.EndOfStream; // true si está al final
```
## StreamWriter
### Escribir Texto
```csharp
using System.IO;
// Crear/sobrescribir archivo
using (StreamWriter writer = new StreamWriter("output.txt"))
{
writer.Write("Hello");
writer.WriteLine(" World");
writer.WriteLine("Línea 3");
}
// Agregar a archivo
using (StreamWriter writer = new StreamWriter("output.txt", append: true))
{
writer.WriteLine("Línea agregada");
}
```
### Métodos de StreamWriter
```csharp
writer.Write("text"); // Escribir sin nueva línea
writer.WriteLine("text"); // Escribir con nueva línea
writer.Flush(); // Forzar escritura a disco
writer.AutoFlush = true; // Auto flush después de cada escritura
```
## Instrucción Using
### Disposición Automática
```csharp
// Correcto - using asegura disposición
using (StreamReader reader = new StreamReader("file.txt"))
{
string content = reader.ReadToEnd();
}
// reader se disposing aquí
// Incorrecto - el archivo puede permanecer bloqueado
StreamReader reader2 = new StreamReader("file.txt");
string content = reader2.ReadToEnd();
reader2.Dispose(); // Debe disposing manualmente
```
### Using Anidado
```csharp
using (StreamReader reader = new StreamReader("input.txt"))
using (StreamWriter writer = new StreamWriter("output.txt"))
{
string line;
while ((line = reader.ReadLine()) != null)
{
writer.WriteLine(line.ToUpper());
}
}
```
## Rutas de Archivos
### Clase Path
```csharp
using System.IO;
string path = @"C:\Users\John\Documents\file.txt";
Path.GetFileName(path); // "file.txt"
Path.GetFileNameWithoutExtension(path); // "file"
Path.GetExtension(path); // ".txt"
Path.GetDirectoryName(path); // "C:\Users\John\Documents"
Path.GetFullPath(path); // Ruta completa
Path.Combine("folder", "file.txt"); // "folder\file.txt"
```
### Métodos de Path
```csharp
Path.ChangeExtension(path, ".md"); // Cambiar extensión
Path.HasExtension(path); // true
Path.IsPathRooted(path); // true si es absoluta
Path.TrimEndingExtension(path); // Sin extensión
```
## Operaciones de Directorio
### Clase Directory
```csharp
using System.IO;
// Crear directorio
Directory.CreateDirectory("newfolder");
// Verificar si existe
Directory.Exists("folder"); // true/false
// Obtener archivos
string[] files = Directory.GetFiles("folder");
string[] txtFiles = Directory.GetFiles("folder", "*.txt");
// Obtener directorios
string[] dirs = Directory.GetDirectories("folder");
// Eliminar (debe estar vacío)
Directory.Delete("folder");
Directory.Delete("folder", recursive: true); // Con contenidos
```
### DirectoryInfo
```csharp
DirectoryInfo dir = new DirectoryInfo(".");
Console.WriteLine(dir.Name); // Nombre de carpeta actual
Console.WriteLine(dir.FullName); // Ruta completa
Console.WriteLine(dir.Parent); // Directorio padre
Console.WriteLine(dir.Root); // Directorio raíz
foreach (FileInfo file in dir.GetFiles())
{
Console.WriteLine($"{file.Name} ({file.Length} bytes)");
}
```
## FileInfo
### Información Detallada de Archivo
```csharp
using System.IO;
FileInfo file = new FileInfo("file.txt");
Console.WriteLine(file.Exists); // true/false
Console.WriteLine(file.Name); // "file.txt"
Console.WriteLine(file.Extension); // ".txt"
Console.WriteLine(file.Length); // Tamaño en bytes
Console.WriteLine(file.CreationTime); // Cuándo se creó
Console.WriteLine(file.LastWriteTime); // Cuándo se modificó
Console.WriteLine(file.LastAccessTime); // Cuándo se accedió
Console.WriteLine(file.DirectoryName); // Carpeta contenida
```
## Trabajar con JSON
### System.Text.Json (C# 8+)
```csharp
using System.Text.Json;
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Person person = new Person { Name = "Alice", Age = 30 };
string json = JsonSerializer.Serialize(person);
// Deserializar
Person? p = JsonSerializer.Deserialize(json);
// Con opciones
var options = new JsonSerializerOptions
{
WriteIndented = true,
PropertyNameCaseInsensitive = true
};
string prettyJson = JsonSerializer.Serialize(person, options);
```
## Trabajar con CSV
### Análisis Manual
```csharp
string[] lines = File.ReadAllLines("data.csv");
foreach (string line in lines)
{
string[] fields = line.Split(',');
Console.WriteLine($"Nombre: {fields[0]}, Edad: {fields[1]}");
}
```
### Escribir CSV
```csharp
using System.Text;
var sb = new StringBuilder();
sb.AppendLine("Nombre,Edad,Ciudad");
foreach (Person p in people)
{
sb.AppendLine($"{p.Name},{p.Age},{p.City}");
}
File.WriteAllText("output.csv", sb.ToString());
```
## Manejo de Excepciones con Archivos
### Operaciones de Archivos Seguras
```csharp
try
{
string content = File.ReadAllText("file.txt");
}
catch (FileNotFoundException)
{
Console.WriteLine("Archivo no encontrado");
}
catch (IOException ex)
{
Console.WriteLine($"Error de E/S: {ex.Message}");
}
// Enfoque más seguro
if (File.Exists("file.txt"))
{
string content = File.ReadAllText("file.txt");
}
```
## Resumen
- Clase File: métodos estáticos para operaciones simples
- StreamReader/StreamWriter: control detallado
- Siempre usar instrucción `using` para disposición adecuada
- Clase Path: manipular rutas de archivos de forma segura
- Clase Directory: operaciones de carpetas
- FileInfo/DirectoryInfo: enfoque orientado a objetos
- System.Text.Json para serialización JSON
Comments
Comments powered by Giscus
To enable comments, add your Giscus embed code here.
Learn more about Giscus →