Programa que Compacta a Extenção Escolhida pelo User

1. Programa que Compacta a Extenção Escolhida pelo User

Jose Alfredo
biriba_di

(usa Outra)

Enviado em 25/11/2011 - 13:39h

Boa tarde pessoal, criei um programa que compacta a extenção escolhida pelo usuario, exemplo:
./compacta /home/Downloads txt
esse comando vai pegar todos o arquivos com extenção txt e compacta-los.
Eis que surge minha duvida, quando ele compacta, se tiver 3 arquivos txt, ele compacata 1 por 1 separados, e nao os 3 em 1 só.
Precisava da ajuda de vcs para saber como compactar todos arquivos em apenas 1.
Segue o codigo:

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

/*

Este programa compacta todos arquivos txt existentes em um determinado diretorio

*/

int main(int argc, char *argv[]){
FILE *fp;
char arquivo_temp[60], comando[80],arquivo_tar[60],arquivo[60];
void printUsage()
{
printf("##########################\n\n");
puts("Programa para compactar arquivos txt...");
printf("\n");
puts("Sintaxe: ");
printf("\n");
puts(" #./compacta <DIRETORIO>");
printf("\n\n");
puts("Exemplo:");
printf("\n");
puts("#./compacta /tmp");
printf("\n");
puts("**compacta todos arquivos txt existentes em /tmp");
printf("\n#########################\n");
}

if (argc < 3)
{
printUsage();
return 0;
}
if (strcmp(argv[1],"--h") == 0)
{
printUsage();
return 0;
}
if (strcmp(argv[2],"--h") == 0)
{
printUsage();
return 0;
}
int i;

char lista[100]="ls ";
strcat(lista,argv[1]);
strcat(lista,"/*.");
strcat(lista,argv[2]);
strcat(lista," > lista");
system(lista);
fp = fopen("lista","r");

while(!feof(fp)){
/*fgets(string,60,fp)*/

fscanf(fp,"%s",arquivo_temp);

//for(i=0;i<strlen(arquivo_temp)-4;i++)
strcat(arquivo,arquivo_temp);

printf("\n\n%s\n\n",arquivo_temp);


/*criando o pacote tar*/

/*comando = 'tar -cf' arquivo_tar arquivo */

strcpy(comando,"tar -cf ");
strcpy(arquivo_tar,arquivo_temp);
strcat(arquivo_tar,".tar");
strcat(comando,arquivo_tar);
strcat(comando," ");
strcat(comando,arquivo_temp);
system(comando);

strcpy(comando,"");

/*criando o pacote bz2*/
strcpy(comando,"bzip2 -z ");
strcat(comando,arquivo_tar);
system(comando);
}
system("rm *.txt -rf");
system("rm *.tar -rf");
fclose(fp);
}



  


2. Re: Programa que Compacta a Extenção Escolhida pelo User

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 28/11/2011 - 08:03h

Bom dia 'biriba_di'.


if (argc < 3)
{
printUsage();
return 0;
}
if (strcmp(argv[1],"--h") == 0)
{
printUsage();
return 0;
}
if (strcmp(argv[2],"--h") == 0)
{
printUsage();
return 0;
}


Isso você pode reduzir para deixar o código mais limpo e fácil de entender:


if ( (argc < 3) || (!strcmp(argv[1], "--h")) || (!strcmp(argv[2], "--h")) ) {
printUsage();
return EXIT_FAILURE;
}


Depois, o que você realmente precisa é da função sprintf().


#include <stdio.h>

int sprintf(char *buf, const char *format, ...);


Com essa função você pode fazer uma outra string com variáveis, etc. Sem a necessidade daquele monte de strcat() e strcpy() que de quebra deixam seu programa cheio de falhas. ;)

Você usa ela assim:


sprintf( command, "tar -cvf compact.tar %s %s %s", file[1], file[2], file[3] );


Supondo que no diretório existam 3 arquivos .txt, e que o usuário pediu a compactação dos txt, depois desse função, a string command será:

"tar -cvf compact.tar file1.txt file2.txt file3.txt"

Dá uma pesquisada nas funções opendir() e readdir() do linux, elas são excelentes para ler diretórios e tudo mais. Colocar um LS dentro de um buffer de 100 posições não é sensato.

Tem a função stat() que também pega informações sobre o arquivo (essa é só por curiosidade se você quiser ;)
http://www.vivaolinux.com.br/script/[C]-Arquivos-e-Stat

Espero ter ajudado,
Qualquer coisa posta denovo,
Enzo Ferber
[]'s






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts