Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

fabriciohm

Interpretador de Comandos - Copia de arquivos por parâmetro.

Recommended Posts

Boa Tarde.

 

 

Estou fazendo um interpretador de comandos em C mas estou com dificuldades na separação dos parâmetros do comando para poder fazer a copia do arquivo.

 

O comando de entrada será: "-copiar origem destino"

 

O comando é enviado inteiro para uma função responsável por efetuar a copia do arquivo, nessa função é feita a separação dos parâmetros usando a função strtok(), porem só encontrei exemplos que usam o espaço " " no strtok() para fazer essa separação mas se o caminho do arquivo tiver espaço ex "C:\\Nova pata\\teste.txt", esse esquema já não da certo.

 

Por favor me deem uma luz nessa situação.

 

 

Essa a função pra copiar arquivos:

//-----------------------------Função para copiar arquivos-----------------------------------------------

int comando_copiar(int d, char comando_comp[100])
{

//O comando_comp corresponde ao comando completo digitado pelo usuario "-copiar origem destino"

//A variavel d serve para saber se o comando foi para copiar "d=0" ou para mover "d=1" o arquivo.

int ch, status, x;
char *psretorno, *arq_origem, *arq_destino;
x = 1;

psretorno = strtok(comando_comp," ");
FILE *origem, *destino;

do
    {
        psretorno = strtok(NULL, " ");
        if(x == 1)
        {
               arq_origem = psretorno;
        }
        if(x == 2)
        {
               arq_destino = psretorno;
        }
        x++;
}while(psretorno != NULL && x < 3);

origem = fopen(arq_origem,"rb");

if (origem == NULL)
{
    printf("\n Nao foi possivel abrir o arquivo de origem!\n");
    exit(EXIT_FAILURE);
}

destino = fopen(arq_destino,"wb");

if (destino == NULL)
{
    fclose(origem);
    printf("\n Nao foi possivel abrir o arquivo de destino!\n");
    exit(EXIT_FAILURE);
}

while ((ch = fgetc(origem)) != EOF )
{
    fputc(ch, destino);
}

printf("\nArquivo copiado com sucesso!\n");

fclose(origem);
fclose(destino);

fflush(stdin);


//Se receber 1 na variavel d, vai copiar e excluir o arquivo (Uma maneira de fazer o comando "mover"

if (d == 1)
{
//printf("\nTeste %s\n",arq_origem);
status = remove(arq_origem);
}
else
{
    printf("\nErro ao mover o arquivo\n");
}

return;

}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

1- Vc pode colocar o nome dentro de aspas duplas. Isso pode ser visto no prompt do windows.

2- Vc pode tentar escapar o espaço, como acontece no Linux.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alguma sugestão para essa separação? Não consegui fazer com que o strtok() "pare" de dividir a string quando encontrar a primeira " e recomece ao encontrar a ultima ", ou seja, uma maneira de pegar o conteúdo com espaços dentro das "" e jogar para outra string permitindo que após isso o strtok() continue a divisão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, não estou entendendo qual é o problema. Vc não está usando o char ** argv?

Poste o resto do código.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Comecei fazendo sem usar o "char ** argv". Esse é começo do programa até a função main:

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

int comando_copiar(int d, char comando_comp[100]);
int comando_mover();
int comando_exit();
int comando_excluir();
int comando_limpatela();
int comando_listdir();
int comando_ajuda();


int main()
{
    int i , x, sai;
    char comando[100], comando_sub[100];


    printf("\n.::Programa Teste::..\n\n\nDigite o comando:\n");
    gets(comando);

    i = 0;
    x = 0;
    sai = 0;

    while (sai != "1")
    {
        while (comando[i] != ' ')
        {
            comando_sub[i] = comando[i];
            i++;
        }

        comando_sub[i] = '\0';
        x = 1;

        if(strncmp(comando_sub,"-dir",20) == 0)
        {
            comando_listdir(comando);
        }

        else if(strncmp(comando_sub,"-exit",20) == 0)
        {
            comando_exit();
        }

        else if(strncmp(comando_sub,"-excluir",20) == 0)
        {
            comando_excluir();
        }

        else if(strncmp(comando_sub,"-limpatela",20) == 0)
        {
            comando_limpatela();
        }

         else if(strncmp(comando_sub,"-copiar",20) == 0)
        {
            comando_copiar(0, comando);
        }

        else if(strncmp(comando_sub,"-mover",20) == 0)
        {
            comando_mover();
        }
        else if(strncmp(comando_sub,"-ajuda",20) == 0)
        {
            comando_ajuda();
        }

        else printf("\nComando invalido!\n");

        fflush(stdin);
        printf("\n\n.::Programa Teste::..\n\n\nDigite o comando:\n");
        gets(comando);
        i = 0;

    }

    fflush(stdin);

}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
gets(comando); => problema de segurança

fflush(Stdin); => comportamento indefinido (existe um tópico fixo neste fórum sobre isso).

 

Quanto a não usar o argv, acho isso uma perda de tempo, pois a maior parte do que vc implementar vai ser jogada fora.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dei uma pesquisada e o gets() realmente não é uma boa, tentei colocar o fgets() no lugar dele mas quando digito o comando e dou enter, nada acontece, pesquisando sobre vi que teria que remover o '\n' mas mesmo testando algumas formas de remover ele, o problema continua e nada acontece.

 

Comecei trocando o gets() em:

printf("\n.::Programa Teste::..\n\n\nDigite o comando:\n");
gets(comando);

por

printf("\n.::Programa Teste::..\n\n\nDigite o comando:\n");
fgets(comando,100,stdin);

Alguma coisa errada com ele?

 

Uma das formas pra remover o /n foi essa:

if(comando[strlen(comando) - 1] == '\n')
{
          comando[strlen(comando) - 1] = '\0';
}

Em relação ao argv, não entendi muito bem sobre o trabalho ser jogado fora, infelizmente nas poucas aulas de C que tivemos na faculdade, a utilização do char ** argv foi muito pouco abordada la no começo do curso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui fazer separação correta dos caminhos de origem e destino enviados juntos com o comando. Era um problema no uso do strtok() e que estava causando o problema com o fgets() também.

 

Obrigado a _Isis_ pelas dicas :).

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.