Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
Ambos lados da revisão anterior Revisão anterior Próxima revisão | Revisão anterior | ||
pua:operacoes_em_diretorios [2020/11/16 16:12] – [Lendo um diretório] maziero | pua:operacoes_em_diretorios [2021/01/26 13:37] (atual) – [Formato de uma entrada de diretório] maziero | ||
---|---|---|---|
Linha 1: | Linha 1: | ||
+ | ====== Operações em diretórios ====== | ||
+ | |||
+ | ===== Operações básicas ===== | ||
+ | |||
+ | Cria um novo diretório com as permissões indicadas por '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | #include < | ||
+ | int mkdir (const char *filename, mode_t mode) | ||
+ | </ | ||
+ | |||
+ | Remove o diretório indicado por '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int rmdir (const char *filename) | ||
+ | |||
+ | #include < | ||
+ | int remove (const char *filename) | ||
+ | </ | ||
+ | |||
+ | Retorna o diretório corrente do processo em '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | char * getcwd (char *buffer, size_t size) | ||
+ | </ | ||
+ | |||
+ | Ajusta o diretório corrente do processo para '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int chdir (const char *filename) | ||
+ | </ | ||
+ | |||
+ | Idem, usando o diretório indicado por '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int fchdir (int filedes) | ||
+ | </ | ||
+ | |||
+ | ===== Formato de uma entrada de diretório ===== | ||
+ | |||
+ | Cada entrada de diretório é definida pelo '' | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Os demais atributos da entrada (tamanho, datas, permissões) fazem parte do arquivo em si, e não de sua entrada de diretório. | ||
+ | |||
+ | <note important> | ||
+ | Algumas constante do campo '' | ||
+ | ===== Lendo um diretório ===== | ||
+ | |||
+ | Diretórios são abertos através de streams de tipo '' | ||
+ | |||
+ | Abre o diretório '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | #include < | ||
+ | DIR * opendir (const char *dirname) | ||
+ | </ | ||
+ | |||
+ | Informa o descritor de arquivo associado ao stream '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | #include < | ||
+ | int dirfd (DIR *dirstream) | ||
+ | </ | ||
+ | |||
+ | Fecha o stream '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | #include < | ||
+ | int closedir (DIR *dirstream) | ||
+ | </ | ||
+ | |||
+ | Lê a próxima entrada do diretório indicado por '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | struct dirent * readdir (DIR *dirstream) | ||
+ | </ | ||
+ | |||
+ | A ordem das entradas não é necessariamente alfabética. Esta função possui uma versão reentrante '' | ||
+ | |||
+ | Reinicia o stream de diretório '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | #include < | ||
+ | void rewinddir (DIR *dirstream) | ||
+ | </ | ||
+ | |||
+ | Indica qual a posição corrente no stream de diretório '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | off_t telldir (DIR *dirstream) | ||
+ | </ | ||
+ | |||
+ | Ajusta a posição corrente do stream de diretório '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | void seekdir (DIR *dirstream, off_t pos) | ||
+ | </ | ||
+ | |||
+ | Esta função permite varrer diretórios de forma bem mais sofisticada, | ||
+ | |||
+ | * varre o diretório indicado por '' | ||
+ | * seleciona somente as entradas que atendem um dado critério, definido pela função '' | ||
+ | * ordena as entradas selecionadas, | ||
+ | * devolve os resultados em '' | ||
+ | * retorna o número de entradas em '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | int scandir (const char *dir, struct dirent ***namelist, | ||
+ | int (*selector) (const struct dirent *), | ||
+ | int (*cmp) (const void *, const void *)) | ||
+ | </ | ||
+ | |||
+ | O funcionamento desta função está detalhado no manual da biblioteca GLibC. | ||
+ | |||
+ | Exemplo: listagem simples do diretório corrente: | ||
+ | |||
+ | <code c listagem.c> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | int main (void) | ||
+ | { | ||
+ | DIR *dirstream; | ||
+ | | ||
+ | |||
+ | // abre um diretório | ||
+ | | ||
+ | if ( ! dirstream ) | ||
+ | { | ||
+ | perror (" | ||
+ | exit (1) ; | ||
+ | } | ||
+ | |||
+ | // varre as entradas do diretório aberto | ||
+ | for (;;) | ||
+ | { | ||
+ | // pega a próxima entrada | ||
+ | direntry = readdir (dirstream) ; | ||
+ | |||
+ | // se for nula, encerra a varredura | ||
+ | if (! direntry) | ||
+ | break ; | ||
+ | |||
+ | // mostra conteúdo da entrada | ||
+ | printf (" | ||
+ | switch (direntry-> | ||
+ | { | ||
+ | case DT_UNKNOWN: | ||
+ | printf (" | ||
+ | break ; | ||
+ | case DT_REG: | ||
+ | printf (" (arquivo)\n" | ||
+ | break ; | ||
+ | case DT_DIR: | ||
+ | printf (" (diretorio)\n" | ||
+ | break ; | ||
+ | default: | ||
+ | printf (" (outros)\n" | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // fecha o diretório | ||
+ | | ||
+ | |||
+ | exit (0); | ||
+ | } | ||
+ | </ | ||