Ir ao conteúdo
  • Cadastre-se

C Ação em vários arquivos em uma pasta em C


Júnior97

Posts recomendados

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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

@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

Link para o comentário
Compartilhar em outros sites

@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

Link para o comentário
Compartilhar em outros sites

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.

 

Link para o comentário
Compartilhar em outros sites

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 );
   }
}

 

Link para o comentário
Compartilhar em outros sites

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!