Listar arquivos de um diretório em C

Publicado por Danilo em 09/12/2004

[ Hits: 31.678 ]

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

Problemas com DELETE no WINE

Rodando o Quanta em uma única instância

Opções de optimização do VNC

CD's do Ubuntu de graça!

Funções de data usando time.h

Leitura recomendada

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

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

Em C, escrever em arquivo fácil

Estampando a data em imagens com apenas um clique no KDE4

Pipelight plugin no Arch Linux

  

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