Ir ao conteúdo
  • Cadastre-se

C Movendo arquivos de uma Pasta


RochaK
Ir à solução Resolvido por isrnick,

Posts recomendados

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.

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
Compartilhar em outros sites

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

 

Link para o comentário
Compartilhar em outros sites

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

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

 

 

Link para o comentário
Compartilhar em outros sites

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?

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

  • Solução

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.

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

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

 

Link para o comentário
Compartilhar em outros sites

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

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!