Ir ao conteúdo

Posts recomendados

Postado

Alguém sabe como eu posso acessar cada arquivo de uma pasta e fazer uma ação com eles? A parte da ação já está pronta, mas preciso que ela seja feita em todos os arquivos dentro de uma pasta. Eu estava tentando usar a biblioteca dirent.h mas só consegui encontrar explicação de como imprimir os nomes dos arquivos na tela

  • Curtir 1
Postado
2 horas atrás, Júnior97 disse:

Alguém sabe como eu posso acessar cada arquivo de uma pasta e fazer uma ação com eles? A parte da ação já está pronta, mas preciso que ela seja feita em todos os arquivos dentro de uma pasta. Eu estava tentando usar a biblioteca dirent.h mas só consegui encontrar explicação de como imprimir os nomes dos arquivos na tela

 

Se você sabe como imprimir os nomes, trata-se de uma ação. Apenas troque o código pela sua ação...

Talvez devesse postar o código...

 

Que explicação ficou faltando sobre dirent?  Ela só vai te oferecer  a lista de nomes dos arquivos mesmo. E se você já tem a tal ação não entendi o que falta.

  • Curtir 1
Postado

@arfneto O código está mais ou menos assim:

DIR *diretorio;
   struct dirent *arquivo;

   diretorio = opendir("pasta");

   while ((arquivo = readdir(diretorio)) != NULL){
       FILE *arq;
       arq = fopen(arquivo,"r");  
       //arq = fopen(arquivo->d_name,"r");   // testei desses dois jeitos e nenhum funcionou
       
       if (arq!=NULL){
         // acao em todos os arquivos
       }
       fclose (arq);
       }
   }
   closedir(pasta);
   }

   return 0;
}
`

O que faltou foi a parte de escolher e abrir cada arquivo para fazer a ação neles, porque tem que ser feita na pasta inteira, mas não estou conseguindo

Postado
5 horas atrás, arfneto disse:

só consegui encontrar explicação de como imprimir os nomes dos arquivos na tela

 

Então você conseguiu a explicação mas não conseguiu colocar em seu programa, certo? Vou ver se tenho um exemplo aqui

Postado

@herbertbahia eu fiz o código me baseando nesse, mas não está funcionando

adicionado 2 minutos depois

@arfneto não exatamente, é porque eu só encontrei explicação de como imprimir na tela os nomes, mas não é o que eu estou tentando fazer. Eu precisava que abrisse cada um e fizesse aquela ação neles. Tentei agora com um teste de erro na abertura do arquivo e apareceu que está falhando na hora de abrir

Postado
12 minutos atrás, Júnior97 disse:

não exatamente, é porque eu só encontrei explicação de como imprimir na tela os nomes, mas não é o que eu estou tentando fazer. Eu precisava que abrisse cada um e fizesse aquela ação neles. Tentei agora com um teste de erro na abertura do arquivo e apareceu que está falhando na hora de abrir

 

 dirent só vai te dar os nomes e a partir daí você chama suas coisas...

 

Imagine uma função mágica que você chama assim

 

char*     proximo_arquivo(const char* Pasta);

E uma função assim:

 

int      executa_acao(const char* arquivo);

 

E a seguinte especificação: 

  • se você chama proximo_arquivo() com um valor diferente de "" é o nome da pasta e próximo arquivo vai preparar a lista de arquivos que tem nessa pasta e retornar digamos "12" se a pasta tiver 12 arquivos. E zero se não conseguir abrir a pasta.
  • se você chama proximo_arquivo() com um valor "" então ela devolve o nome do proximo arquivo na pasta e aí você chama executa_acao() com o nome do tal arquivo e a fila anda.

Notou que isso fecha o círculo? É só isso. Poda ser melhor, depois eu mostro um exemplo melhor.

E você já pode testar isso com uma função fake que simula uma lsita de arquivos.

 

Veja um exemplo:

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

int           executa_acao(const char*);
const char*   proximo_arquivo(const char*);

int main(int argc, char** argv)
{
    // testes
    const char* lista = proximo_arquivo(".\\teste");
    if (lista == "")
    {
        printf("Nao conseguiu a lista de arquivos\n");
        return 0;
    }
    printf("Lista retornou %s arquivos\n", lista);
    int N = atoi(lista);
    for (int i = 0; i < N; i += 1)
    {
        int res = executa_acao(proximo_arquivo(""));
        printf("acao() retornou %d\n", res);
    };  // for

};  // main()

const char* proximo_arquivo(const char* pasta)
{
    static int N = -1;
    static const char testes[3][20] =
    { "a.txt", "b.txt", "c.txt" };
    static const char* total = "3";
    if (pasta == "")
    {
        N = N + 1;
        switch (N)
        {
        case 0:
        case 1:
        case 2:
            return testes[N];
            break;
        default:
            return NULL;
            break;
        };  // switch()
    }
    else
    {
        printf("Montando lista para a pasta '%s'\n",
            pasta);
        N = -1;
        // aqui seria o caso de chamar 
        // dirent e preencher uma lista
        // agora não preciso fazer nada exceto
        // marcar como iniciado
    };  // if()
    return total;
}

int executa_acao(const char* arquivo)
{
	printf("    ==> executa acao para arquivo '%s'\n",
        arquivo);
    return 0;
}

Você pode criar uma pasta teste e colocar os arquivos lá e ir testando as ações enquanto não se entende com dirent. 

Confirme se entendeu. RODE esse programa.
 

image.png.261ddc5c5c1065d352fe212e0cb614e7.png

 

Entenda como pode ir progredindo... É tudo falso mas é tudo verdade. Por isso programação é interessante.

 

Postado
4 minutos atrás, Júnior97 disse:

@arfneto Entendi, obrigado

 

dirent funciona mais ou menos como está nese exemplo ai.

 

Se está usando windows pode também usar _findfirst() / _findnext(). Estão documentadas em https://docs.microsoft.com/en-us/cpp/c-runtime-library/filename-search-functions?view=vs-2019 onde tem um programa exemplo que lista todos os arquivos .c no diretório corrente. Esse exemplo aqui:

// crt_find.c
// This program uses the 32-bit _find functions to print
// a list of all files (and their attributes) with a .C extension
// in the current directory.

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

int main( void )
{
   struct _finddata_t c_file;
   intptr_t hFile;

   // Find first .c file in current directory
   if( (hFile = _findfirst( "*.c", &c_file )) == -1L )
      printf( "No *.c files in current directory!\n" );
   else
   {
      printf( "Listing of .c files\n\n" );
      printf( "RDO HID SYS ARC  FILE         DATE %25c SIZE\n", ' ' );
      printf( "--- --- --- ---  ----         ---- %25c ----\n", ' ' );
      do {
         char buffer[30];
         printf( ( c_file.attrib & _A_RDONLY ) ? " Y  " : " N  " );
         printf( ( c_file.attrib & _A_HIDDEN ) ? " Y  " : " N  " );
         printf( ( c_file.attrib & _A_SYSTEM ) ? " Y  " : " N  " );
         printf( ( c_file.attrib & _A_ARCH )   ? " Y  " : " N  " );
         ctime_s( buffer, _countof(buffer), &c_file.time_write );
         printf( " %-12s %.24s  %9ld\n",
            c_file.name, buffer, c_file.size );
      } while( _findnext( hFile, &c_file ) == 0 );
      _findclose( hFile );
   }
}

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!