Ir ao conteúdo

C Movendo arquivos de uma Pasta


Ir à solução Resolvido por isrnick,

Posts recomendados

Postado

Bom Dia pessoal, criei um programa em C que ler todos os arquivos de uma pasta e gera um só arquivo com todas essas informações, o que eu estou tentando fazer e não estou conseguindo e que quando ele gerar o arquivo ele mova para outra pasta.

 

Pasta Principal com os Arquivos .
                ⬇
          Programa 
                ⬇
                    ➡Pasta com o Arquivo Unificado.
                    ➡ Pasta com os Arquivos.(Arquivos movidos da pasta principal.)
               ⬇
Pasta Principal com os Arquivos .(Pasta Vazia).

 

o esquema seria mais ou menos isso ai.

Postado

@vangodp esse processo vai ficar rodando automaticamente, então toda vez que ele gerar o arquivo uma vez, teria de deixar a pasta vazia para quando for gerar de novo não pegar os dados dos arquivos anteriores.

Essa solução que você deu resolve 50% do problema valeu.

Postado

@vangodp cara basicamente é isso,

 

1) Copiar os dados da PASTA1 e gerar um só arquivo unificado.

2) Salvar o arquivo unificado em uma pasta.(Isso acho que já conseguo fazer uma aquela solução que você falou)

3) Mover os arquivos PASTA1 que foram usados para criar o arquivo Unificado.(Essa pasta tem que ficar vazia de novo porque vai receber sempre novos arquivos, para gerar novamente outro arquivo unificado com outras informações)

 

obs: Quero mover os arquivos ao invés de deletar para ficar como uma especie de Backup, se precisar desse arquivo um dia.

Postado

O jeito mais simples de mover um arquivo na mesma unidade de armazenamento é usar a função rename() para "renomear o arquivo para uma outra pasta".

 

Tipo:

rename("arquivo.txt", "subpasta/arquivo.txt");

Nessa caso move para uma subpasta da pasta atual, mas poderia usar caminhos relativos (ex: "../pastaparalela/arquivo.txt"), ou caminhos completos/absolutos (ex: "C:/caminho/da/pasta/arquivo.txt").

 

Mas isso só funciona na mesma unidade, se for mover para outra unidade tem que usar outros métodos.

Postado

@isrnick cara você me ajudou em um problema da data e hora, olha se consegue agora mais uma vez. rsrs

	agora = time(NULL);
    	strftime(vetordechar, comprimentodovetor, " > ArqsJuntos_Data%F_Hora%Hh%Mm%Ss.csv", localtime(&agora));
	strcat(comandoJuntarArqs, vetordechar);

 

adicionado 23 minutos depois
5 horas atrás, vangodp disse:

E por que não gerar o tal arquivo diretamente na nova pasta?

FILE * arquivo = fopen("C:\Users\SEUNOMEAQUI\Desktop\...", "w")

 

@vangodp cara tenho que colocar nesse strcat.

 strftime(vetordechar, comprimentodovetor, " > ArqsJuntos_Data%F_Hora%Hh%Mm%Ss.csv", localtime(&agora));
	strcat(comandoJuntarArqs, vetordechar);

 

Postado

Primeiro, o arquivo unificado já deveria ser gerado dentro da pasta final, então pode colocar o nome da subpasta já no strftime:

strftime(vetordechar, comprimentodovetor, " > PastaComOArquivoUnificado/ArqsJuntos_Data%F_Hora%Hh%Mm%Ss.csv", localtime(&agora));

 

Obs: A pasta já deve existir, ele não vai criar a pasta.

 

Mas a parte de mover cada arquivo depende de ter todos os nomes dos arquivos, e fazer um ciclo usar rename() para mover cada um. Como você está pegando os nomes dos arquivos? Eles seguem um padrão? Está usando dirent.h?

  • Curtir 1
Postado

@vangodp

Citação

	printf("antes da linha de listar os arquivos \n");

	system("ls -R *.csv > /home/clientes/Danylo//ListaDeArquivos.csv"); //Cria um arquivo com o nome de todos os arquivos com extensão .csv.
	printf("depois da linha de listar os arquivos \n ");
	
	
	//command('.exe',retorno);
		 
	char juntarArqs[10000];
	char comandoJuntarArqs[10000];
	strcpy(juntarArqs, "");
	strcpy(comandoJuntarArqs, "cat ");
	//Adicionar Data e Hora
	char vetordechar[100];
    size_t comprimentodovetor = 100;
    time_t agora = time(NULL);
	
		 	 

	strcpy(arquivo,"/home/clientes/Danylo/ListaDeArquivos.csv"); //Vai abrir o arquivo que foi criado.
	alltrim(arquivo);
	
	if((arq_ent = fopen(arquivo, "r")) == NULL)
    {
        printf("\nErro Abrindo arquivo de entrada %s\n", arquivo);
        exit(1);
    } 

    while (fgets(registro, 400, arq_ent) != NULL) //Ler todos os arquivos de dentro do arquivo que o programa criou.
    {
		printf("Lendo Arquivo \n ");
        Linha++;
		strcpy(registroAux, "");
		
			
		
		//printf("Linha numero %d \n",  Linha);
		printf("registro = -%s- \n", registro);
		alltrim(registro);
		Converte(registro); //Retira os caracteres especiais para não ocorrer quebra de linha, 
							//depois ele faz a linha de comando que uni todos os arquivos em um só.		
		printf("registro1 = -%s- \n", registro);
		
		
		
		printf("registroAux = -%s- \n\n", registroAux);
		
		
		if(Linha == 1)
		{
			strcpy(comandoJuntarArqs, "cat ");
			strcat(comandoJuntarArqs, registro); 
			
			
		}
		else
		{
			
			strcat(comandoJuntarArqs, " "); 
			strcat(comandoJuntarArqs, registro); 
			
		} 
    }	
	
	agora = time(NULL);
    strftime(vetordechar, comprimentodovetor, " > ArqsJuntos_Data%F_Hora%Hh%Mm%Ss.csv", localtime(&agora));
	strcat(comandoJuntarArqs, vetordechar);
	
	
	printf("linha para juntarArqs %s \n", comandoJuntarArqs);
	system(comandoJuntarArqs);
	 
	
	
	
    printf("Fim do Processo. ");
    fflush(stdout);
    system("date +%HH:%MM:%SS");
    printf("\n");

    exit(0);
}

 

 

Postado

@vangodp  tem umas gambiarras que nem eu entendo mais, rsrs nao sei como mover os arquivos so estou indo na pasta lendo e gravando em outro arquivo.

 

obs: não estou usando dirent.h.

 

Postado

Isso é só parte do código certo? Você usou fclose() para fechar o "arquivo" aberto com fopen() em algum lugar do código? Se ainda estiver aberto depois do "system(comandoJuntarArqs);" daria para colocar um "rewind(arquivo);" para retornar ao início do arquivo e então fazer outro loop com fgets() para ler os nomes dos arquivos novamente, e usá-los no rename().

 

Como exatamente estão as pastas do programa, dos arquivos, dos arquivos combinados, dos arquivos já processados e movidos? Especificamente quais são os endereços delas?

 

Pergunto pois ls -R é recursivo, e isso pode ser um problema se estiverem em subpastas da pasta com os arquivos .csv . Porque escolheu usar -R?

Postado

@isrnick

system("ls -R *.csv > /home/clientes/Danylo/ListaDeArquivos.csv"); //Cria um arquivo com o nome de todos os arquivos com extensão .csv.

 

strcpy(arquivo,"/home/clientes/Danylo/ListaDeArquivos.csv"); //Vai abrir o arquivo que foi criado.
    alltrim(arquivo);

 

strftime(vetordechar, comprimentodovetor, " > /home/clientes/Danylo/Lista/ArqsJuntos_Data%F_Hora%Hh%Mm%Ss.csv", localtime(&agora));
    strcat(comandoJuntarArqs, vetordechar); //Cria o arquivo unificado. A solução que você deu serviu para já salvar o arquivo em outra pasta.

 

a unica coisa que falta e mover os arquivos que ele usa para gerar tal arquivo.

  • Solução
Postado

Seria algo assim depois do "system(comandoJuntarArqs);" :

rewind(arq_ent);
while (fgets(registro, 400, arq_ent) != NULL) //Ler todos os arquivos de dentro do arquivo que o programa criou.
{
    strcpy(registroAux, "/caminho/da/pasta/de/backup/");
    strcat(registroAux, registro);
    rename(registro, registroAux);
}

Assumindo que eu esteja entendendo corretamente o seu código e a organização dos arquivos.

Postado

Ola usando linguagem C, tente pesquisar sobre a biblioteca <dirent.h> ela possui algumas funções que ajudariam muito em seu problema, caso tenha duvidas sobre os tipos especificos da biblioteca, há uma postagem no github oficila dela explicando com detalhes o uso de cada função e conversão de tipos

Postado

@isrnick Estou tentando fazer assim, porque ele pega a lista com os arquivos que usei para criar o arquivo unificado, fazendo assim ele move que mover só usados não tendo perigo de no meio do processo entra outro arquivo na pasta e ele mover tb.

 

//<------------Movendo Arquivos------------>
	
	if((arq_ent = fopen(arquivo, "r")) == NULL)
    {
        printf("\nErro Abrindo arquivo de entrada %s\n", arquivo);
        exit(1);
    } 

    while (fgets(registro, 400, arq_ent) != NULL) //Ler todos os arquivos de dentro do arquivo que o programa criou.
    {
		printf("\nMovendo Arquivo \n ");
        Linha++;
		strcpy(registroAux, "");
		
		printf("Arquivo = %s- \n", registro);
		alltrim(registro);
		Converte(registro); //Retira os caracteres especiais para não ocorrer quebra de linha.		
		printf("registro1 = %s- \n", registro);
				
		printf("registroAux = %s- \n\n", registroAux);
		
		 
    }

 

Postado

Sim, no meu código estou assumindo que o arq_ent não foi fechado com fclose(), aí uso rewind para voltar ao início do arquivo e aí é só ler dês do início com fgets() novamente.

 

Talvez você também deva adicionar esse alltrim() e Converte() ao meu código para processar o texto do registro...

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