Implementación Práctica
Escenarios de Manipulación de Directorios en el Mundo Real
1. Utilidad de Búsqueda de Archivos
#include <dirent.h>
#include <stdio.h>
#include <string.h>
int search_file(const char *directory, const char *target) {
DIR *dir;
struct dirent *entry;
dir = opendir(directory);
if (dir == NULL) {
perror("No se pudo abrir el directorio");
return -1;
}
while ((entry = readdir(dir)) != NULL) {
if (strcmp(entry->d_name, target) == 0) {
printf("Archivo encontrado: %s\n", target);
closedir(dir);
return 0;
}
}
closedir(dir);
printf("Archivo no encontrado\n");
return 1;
}
Estrategias de Recorrido de Directorios
Búsqueda Recursiva de Directorios
graph TD
A[Iniciar Búsqueda en Directorio] --> B{¿Es un directorio?}
B --> |Sí| C[Buscar Recursivamente Subdirectorios]
B --> |No| D[Procesar Archivo]
C --> E[Repetir Proceso de Búsqueda]
Implementación Recursiva
void recursive_directory_scan(const char *path) {
DIR *dir;
struct dirent *entry;
char full_path[1024];
dir = opendir(path);
if (dir == NULL) {
perror("No se puede abrir el directorio");
return;
}
while ((entry = readdir(dir)) != NULL) {
if (entry->d_type == DT_DIR) {
if (strcmp(entry->d_name, ".") != 0 &&
strcmp(entry->d_name, "..") != 0) {
snprintf(full_path, sizeof(full_path),
"%s/%s", path, entry->d_name);
printf("Buscando directorio: %s\n", full_path);
recursive_directory_scan(full_path);
}
} else {
printf("Archivo: %s\n", entry->d_name);
}
}
closedir(dir);
}
Operaciones Avanzadas de Directorios
Detección de Tipos de Archivos
| Tipo de Archivo |
Descripción |
| DT_REG |
Archivo regular |
| DT_DIR |
Directorio |
| DT_LNK |
Enlace simbólico |
| DT_FIFO |
Tubería nombrada |
| DT_SOCK |
Socket |
Clasificador de Archivos Completo
void classify_files(const char *directory) {
DIR *dir;
struct dirent *entry;
dir = opendir(directory);
if (dir == NULL) {
perror("Error al abrir el directorio");
return;
}
while ((entry = readdir(dir)) != NULL) {
switch (entry->d_type) {
case DT_REG:
printf("Archivo regular: %s\n", entry->d_name);
break;
case DT_DIR:
printf("Directorio: %s\n", entry->d_name);
break;
case DT_LNK:
printf("Enlace simbólico: %s\n", entry->d_name);
break;
}
}
closedir(dir);
}
Técnicas de Optimización de Rendimiento
- Minimizar las llamadas al sistema repetidas.
- Utilizar la asignación de búfer de forma eficiente.
- Implementar comprobaciones de errores.
- Cerrar los flujos de directorio rápidamente.
Recomendación de LabEx
LabEx proporciona entornos interactivos para practicar técnicas avanzadas de manipulación de directorios y mejorar las habilidades de programación de sistemas.
Buenas Prácticas
- Manejar la asignación de memoria cuidadosamente.
- Implementar comprobaciones de errores exhaustivas.
- Utilizar tamaños de búfer apropiados.
- Cerrar los recursos después de su uso.
- Considerar las implicaciones de rendimiento.
Ejemplo de Escenario Complejo
Calculadora de Tamaño de Directorio
long calculate_directory_size(const char *path) {
DIR *dir;
struct dirent *entry;
long total_size = 0;
char full_path[1024];
struct stat file_stat;
dir = opendir(path);
if (dir == NULL) {
perror("No se puede abrir el directorio");
return -1;
}
while ((entry = readdir(dir)) != NULL) {
if (entry->d_type == DT_REG) {
snprintf(full_path, sizeof(full_path),
"%s/%s", path, entry->d_name);
if (stat(full_path, &file_stat) == 0) {
total_size += file_stat.st_size;
}
}
}
closedir(dir);
return total_size;
}