Implementação Prática
Cenários de Manipulação de Diretórios no Mundo Real
1. Utilitário de Busca de Arquivos
#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("Não foi possível abrir o diretório");
return -1;
}
while ((entry = readdir(dir)) != NULL) {
if (strcmp(entry->d_name, target) == 0) {
printf("Arquivo encontrado: %s\n", target);
closedir(dir);
return 0;
}
}
closedir(dir);
printf("Arquivo não encontrado\n");
return 1;
}
Estratégias de Percurso de Diretórios
Busca Recursiva de Diretórios
graph TD
A[Iniciar Varredura de Diretório] --> B{É um Diretório?}
B --> |Sim| C[Varredura Recursiva das Subpastas]
B --> |Não| D[Processar Arquivo]
C --> E[Repetir o Processo de Varredura]
Implementação Recursiva
void recursive_directory_scan(const char *path) {
DIR *dir;
struct dirent *entry;
char full_path[1024];
dir = opendir(path);
if (dir == NULL) {
perror("Não foi possível abrir o diretório");
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("Varrendo diretório: %s\n", full_path);
recursive_directory_scan(full_path);
}
} else {
printf("Arquivo: %s\n", entry->d_name);
}
}
closedir(dir);
}
Operações Avançadas de Diretórios
Detecção de Tipo de Arquivo
| Tipo de Arquivo |
Descrição |
| DT_REG |
Arquivo regular |
| DT_DIR |
Diretório |
| DT_LNK |
Link simbólico |
| DT_FIFO |
Pipe nomeado |
| DT_SOCK |
Socket |
Classificador de Arquivos Abrangente
void classify_files(const char *directory) {
DIR *dir;
struct dirent *entry;
dir = opendir(directory);
if (dir == NULL) {
perror("Erro ao abrir o diretório");
return;
}
while ((entry = readdir(dir)) != NULL) {
switch (entry->d_type) {
case DT_REG:
printf("Arquivo regular: %s\n", entry->d_name);
break;
case DT_DIR:
printf("Diretório: %s\n", entry->d_name);
break;
case DT_LNK:
printf("Link simbólico: %s\n", entry->d_name);
break;
}
}
closedir(dir);
}
Técnicas de Otimização de Desempenho
- Minimize chamadas de sistema repetidas.
- Utilize alocação de buffer eficientemente.
- Implemente verificação de erros.
- Feche fluxos de diretório prontamente.
Recomendação LabEx
O LabEx fornece ambientes interativos para praticar técnicas avançadas de manipulação de diretórios e aprimorar as habilidades de programação de sistemas.
Boas Práticas
- Lidar com alocação de memória cuidadosamente.
- Implementar verificação abrangente de erros.
- Usar tamanhos de buffer apropriados.
- Fechar recursos após o uso.
- Considerar as implicações de desempenho.
Exemplo de Cenário Complexo
Calculadora de Tamanho de Diretório
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("Não foi possível abrir o diretório");
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;
}