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:16] – [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); | ||
| + | } | ||
| + | </ | ||