Listar arquivos de um diretório em C

Publicado por Danilo em 09/12/2004

[ Hits: 31.675 ]

Blog: http://www.danilocesar.com

 


Listar arquivos de um diretório em C



Esses dias precisei listar arquivos em C e não consegui de jeito nenhum.

Então descobri a dirent.h e a função scandir...

Segue um exemplo que achei na "man-page":

/* print files in current directory in reverse order */
#include
main(){
struct dirent **namelist;
int n;

n = scandir(".", &namelist, 0, alphasort);
if (n < 0)
perror("scandir");
else {
while(n--) {
printf("%s\n", namelist[n]->d_name);
free(namelist[n]);
}
free(namelist);
}
}

Fonte:

$ man scandir

Outras dicas deste autor

Opções de optimização do VNC

Sockets em shell script

CD's do Ubuntu de graça!

HTTP headers, HTTP por força bruta

Câmera Sony P32 no Linux [Debian]

Leitura recomendada

Em C, escrever em arquivo fácil

Seu compilador GCC não funciona mais, como solucionar?

Como criar um diretório em C/C++

Instalando Kubuntu 7.10 com proxy

Conexão de rede cabeada no Gnome com Avahi

  

Comentários
[1] Comentário enviado por scottys0 em 09/12/2004 - 12:19h

retificando
#include <stdio.h>
#include <dirent.h>

Fernando Camargo

[2] Comentário enviado por yuri.carvalho em 08/06/2006 - 11:19h

oO

[3] Comentário enviado por removido em 09/10/2006 - 22:24h

Gostei do código. Com isso fica bem mais fácil manipular arquivos.

[4] Comentário enviado por cacjorge em 08/05/2007 - 08:57h

listar arquivos em um diretorio em c++:
#include <iostream>

int main()
{
system("ls pasta");
}


testem e vejam :)

[5] Comentário enviado por bruno_dudinha em 07/12/2007 - 16:22h

Nobres colegas...seguidores desta maravilhosa linguagem c!:-)
Tenho algumas dúvidas!:-( Espero que vcs me ajudem!:-)
Estou desenvolvendo um software que pega alguns códigos e tipos de documentos, voltado para este último citado, onde armazena em vetores os códigos de usuário, tipo de documento, etc...
vcs verão no código logo mais. O software em si está quase pronto...está faltando digamos que o método de ordenação dos
tipos de documentos com suas respectivas ordens como por exemplo a data de produção, o "proprietário" do documento que é aberto e salvo como um arquivo no formato .txt!!! Vcs poderiam iluminar os meus pensamentos e me dizer como fazer ou até mesmo me enviar por e-mail um exemplo trabalhado em cima do código que realmente funcione:-) Já tentei de tudo mas não estou conseguindo resolver!
Se puderem me responder o mais rápido possível...fico muito grato! O código é:

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
struct documento {
char numero[5];
char ano[5];
char tipo_cod[5];
char resp_cod[5];
char data[10];
char assunto[100];
char inativo[2];
char status;
} doc;
FILE *fdoc;
/*prototipo das funcoes*/
void incluir (void);
void consultar(void);
void excluir(void);
void alterar(void);
void abrir(void);
void listar(void);

int main(void){
char opcao[2], op;
do{
do{
system("cls");
printf("\n\n\n\n\n\n\n");
printf("\t########################################################\n");
printf("\t# #\n");
printf("\t# Programa de Controle de Documentos #\n");
printf("\t# #\n");
printf("\t########################################################\n\n");
printf("\n Digite uma das opcoes\n\n");
printf("\n I - Incluir");
printf("\n A - Alterar");
printf("\n E - Excluir");
printf("\n C - Consultar");
printf("\n L - Listar");
printf("\n S - Sair");
printf("\n\n\n Opcao:");
gets(opcao);
op=tolower(*opcao);
} while(!strchr("iaeclsh",op));
switch(op){/*D*/
case 'i' : incluir(); break;
case 'a' : alterar(); break;
case 'e' : excluir(); break;
case 'c' : consultar(); break;
case 'l' : listar(); break;
case 's' : exit(0);
}
}while(1);
}
/*Funcoes*/
void abrir(char tipo[3])
{
if((fdoc=fopen("C:\documento.txt", tipo))==NULL)
{printf("\nO arquivo nao pode ser aberto!! \n");
getch();
exit(1);
}
}
void incluir(void)
{
abrir("ab+");
fseek(fdoc,0L, SEEK_END);

do
{
printf("\n Digite o numero ou <FIM> para sair:\n\n");
gets(doc.numero);

if ((strcmp(doc.numero,"fim")!=0)&&(strcmp(doc.numero,"FIM")!=0)){
printf("\n Ano(1990):"); gets(doc.ano);
printf("\n Tipo(codigo):"); gets(doc.tipo_cod);
printf("\n Responsavel(codigo):"); gets(doc.resp_cod);
printf("\n Data (31/12/1990):"); gets(doc.data);
printf("\n Assunto:"); gets(doc.assunto);
printf("\n Inativo (0=Ativo e 1=Inativo):"); gets(doc.inativo);
doc.status='1';
if(fwrite(&doc, sizeof(struct documento), 1, fdoc) != 1)
{
printf("\n Erro de gravacao!");
getch();
}
else
{ printf("\n Gravacao feita com sucesso!\n\n");}
}
}while((strcmp(doc.numero,"fim")!=0)&&(strcmp(doc.numero,"FIM")!=0));
fclose(fdoc);
}
int busca (void){
int achou=-1,posicao=0;
char numerop[5];
abrir("rb");
printf("\nDigite o numero para consultar:");
gets(numerop);
rewind(fdoc);
while((!feof(fdoc))&&(achou==-1))
{
fread(&doc, sizeof(struct documento), 1, fdoc);
if (!feof(fdoc))
{if (strcmp(numerop, doc.numero)==0)
{if (doc.status=='0')
{posicao=-2;}
achou=1;
}
else{posicao++;}
}
else{posicao=-1;}
}
if (achou==-1)
{posicao=-1;}
fclose(fdoc);
return(posicao);
}
void consultar(void){
int pos;
pos=busca();
if(pos==-1)
{
printf("\nNumero inexistente!");
getch();
}
else if(pos==-2)
{
printf("\nNumero inexistente no arquivo!");
getch();
}
else
{
abrir("rb+");
fseek(fdoc,pos*sizeof(struct documento),SEEK_SET);
fread(&doc, sizeof(struct documento), 1, fdoc);
printf("\n\n----------------------------------------");
printf("\nNumero:%s",doc.numero);
printf("\nAno:%s",doc.ano);
printf("\nTipo:%s",doc.tipo_cod);
printf("\nResponsavel:%s",doc.resp_cod);
printf("\nData:%s",doc.data);
printf("\nAssunto:%",doc.assunto);
printf("\nInativo:%",doc.inativo);
getch();
}
fclose(fdoc);
}
void alterar(void){
int pos;
pos=busca();
if (pos==-1)
{
printf("\nNumero inexistente no arquivo");
getch();
}
else if(pos==-2)
{
printf("\nNumero inexistente no arquivo!");
getch();
}
else
{
abrir("rb+");
fseek(fdoc,pos*sizeof(struct documento),SEEK_CUR);
fread(&doc, sizeof(struct documento), 1, fdoc);
printf("\nDeseja alterar o seguinte registro?");
printf("\nNumero:%s",doc.numero);
printf("\nAno:%s",doc.ano);
printf("\nTipo:%s",doc.tipo_cod);
printf("\nResponsavel:%s",doc.resp_cod);
printf("\nData:%s",doc.data);
printf("\nAssunto:%s",doc.assunto);
printf("\nInativo:%s",doc.inativo);
getch();
printf("\nDigite as informacoes corretas:");
printf("\nNumero:");
gets(doc.numero);
printf("\nAno:");
gets(doc.ano);
printf("\nTipo:");
gets(doc.tipo_cod);
printf("\nResponsavel:");
gets(doc.resp_cod);
printf("\nData:");
gets(doc.data);
printf("\nAssunto:");
gets(doc.assunto);
printf("\nInativo:");
gets(doc.inativo);
doc.status='1';
fseek(fdoc,pos*sizeof(struct documento),SEEK_SET);
if(fwrite(&doc, sizeof(struct documento),1, fdoc)!=1)
{
printf("\nErro na gravacao!");
}
else
{
printf("\nAlteracao feita com sucesso!");
getch();
}
}
fclose(fdoc);
}
void listar(void) {
int cont=0;

abrir("rb");
fseek(fdoc, 0L, SEEK_SET);
fread(&doc, sizeof(struct documento),1, fdoc);
do
{
if (doc.status!='0')
{
printf("\n---------------------------------------");
printf("\nNumero:%s",doc.numero);
printf("\nAno:%s",doc.ano);
printf("\nTipo:%s",doc.tipo_cod);
printf("\nResponsavel:%s",doc.resp_cod);
printf("\nData:%s",doc.data);
printf("\nAssunto:%s",doc.assunto);
printf("\nInativo:%s",doc.inativo);
cont++;
}
fread(&doc, sizeof(struct documento),1, fdoc);
}while(!feof(fdoc));
printf("\n#Numero de Registros=%d",cont);
getch();
}
void excluir(void){
int pos;
pos=busca();
if(pos==-1)
{
printf("\nNumero inexistente no arquivo");
getch();
}
else
{
if(pos==-2)
{
printf("\nNumero excluido do arquivo");
getch();
}
else
{
abrir("rb+");
fseek(fdoc, pos*sizeof(struct documento), SEEK_SET);
fread(&doc, sizeof(struct documento), 1, fdoc);
printf("\n---------------------------------------");
printf("\nNumero: %s",doc.numero);
printf("\nAno: %s",doc.ano);
printf("\nTipo: %s",doc.tipo_cod);
printf("\nResponsavel: %s",doc.resp_cod);
printf("\nData: %s",doc.data);
printf("\nAssunto: %s",doc.assunto);
printf("\nInativo: %s",doc.inativo);
printf("\nEste Registro #%d sera excluido",(pos+1));
getch();
//strcpy(reg.status,"0");
doc.status='0';
fseek(fdoc, pos*sizeof(struct documento), SEEK_SET);
if(fwrite(&doc, sizeof(struct documento), 1, fdoc)!=1)
{
printf("\nErro na gravacao!");
getch();
}
else
{
printf("\nExclusao feita com sucesso!");
getch();
}
}
}
fclose(fdoc);
}

...o meu e-mail é: bruno_duda1@yahoo.com.br
Aguardo a resposta e valeu pela atenção!:-)

[6] Comentário enviado por stanley_sathler em 20/11/2009 - 21:47h

Não precisa disso tudo, Danilo. Se você quer listar o que há dentro de uma pasta, basta usar a função system
-
main()
{
system("ls ~/diretorio");
}
-
Lembre-se que para usar a função system é necessário usar a stdlib.h

[7] Comentário enviado por removido em 04/01/2010 - 02:23h

Complementando o que o Stanley disse: da mesma forma que pode-se listar arquivos de um diretório, pode-se criar e apagar, usando, também, a função system();

#include <stdio.h>
#include <stdlib.h>

int main() {

system("ls ~/");
system("cd ~/ && touch exemplo.txt"); // Ou se preferir: system("touch ~/exemplo.txt");
// O mesmo para apagar:
system("cd ~/ && rm exemplo.txt"); // Também, se preferir: system("rm ~/exemplo.txt");

return(0);
}

A função system(); pode servir de interface Aplicativo/Shell de forma bastante abrangente.
Todo e qualquer comando poderá ser executado.

Caso tenham interesse, fiz um software que serviu de projeto da faculdade chamado SysControl.
Ele explora bastante as funcionalidades da função system();.
Podem baixá-lo através deste endereço: https://sourceforge.net/projects/syscontrol/

Um abraço!

[8] Comentário enviado por removido em 05/09/2013 - 16:32h

Danilo seu código funciona bem, inclui as bibliotecas que estavam faltando nele.

/* print files in current directory in reverse order */
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{

struct dirent **namelist;
int n;

n = scandir(".", &namelist, 0, alphasort);

if (n < 0)
perror("scandir");

else {
while (n--) {
printf ("%s\n", namelist[n]->d_name);
free(namelist[n]);
}

free(namelist);
}

return (0);
}

[9] Comentário enviado por Steve em 07/11/2018 - 18:55h

O Código postado NÃO FUNCIONA porque está INCOMPLETO!

[10] Comentário enviado por linersantos em 07/05/2020 - 04:44h

Bom dia.
Tentei usar esse código porque preciso ler 1000 arquivos de um diretorio e armazenar os dados. Primeiro tentei escrever um codigo para simplesmente listar os arquivos e aparece ".." e "." como se fossem arquivos também. O que posso fazer?
e.g. meu diretorio tem 2 arquivos: "0.dat" e "1.dat"
ao executar o seu codigo a tela exibe o seguinte resultado:
1.dat
0.dat
..
.
Tem como fazer com que o código nao interprete .. e . como se fossem arquivos?



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts