← C# EspañolChapter 10 of 13

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 →