Segunda execucao da classe

Ola pessoal. Estou listando a classe abaixo que realiza um FTP. Eu passo os parametros para a classe (java nome_da_classe host usuario senha arquivo diretorio (ascii | binary) (active | pasv) ) e ela executa normalmente baixando para a maquina local os arquivos especificados. Logicamente o main() recebe os 7 parametros que passei. Ao executar a classe novamente com os mesmos parametros (java nome_da_classe host usuario senha arquivo diretorio (ascii | binary) (active | pasv) ) ai vem a surpresa: ao ler o args[] no main() nao existem mais 7 parametros e sim os 7 + os nomes dos arquivos baixados para a maquina local. E o pior eh que os parametros originais sao deslocados para o final do array. Por exemplo, eu chamo a classe com os seguintes parametros:

“java FTPClientTest 172.17.5.5 anonimo teste *.txt arq/ ascii active”

Ao executar, no metodo main(), sao recuperados os 7 parametros do args[] -

args[0] = “172.17.5.5”;
args[1] = “anonimo”;
args[2] = “teste”;
args[3] = “*.txt”;
args[4] = “arq/”;
args[5] = “ascii”;
args[6] = “active”;

  • e os arquivos escolhidos sao baixados. Vamos supor que baixou-se dois arquivos: teste1.txt e teste2.txt.Ao executar novamente com os mesmos parametros -

“java FTPClientTest 172.17.5.5 anonimo teste *.txt arq/ ascii active” -

o conteudo do args[] vai ser o seguinte:

args[0] = “172.17.5.5”;
args[1] = “anonimo”;
args[2] = “teste”;
args[3] = “teste1.txt”;
args[4] = “teste2.txt”;
args[5] = “arq/”;
args[6] = “ascii”;
args[7] = “active”;

Com isso o erro ocorre devido ao posicionamento dos parametros. Alguem pode me ajudar?? Aguardo uma resposta.

import java.io.IOException;
import java.io.*;

public class FTPClientTest {
public static void main(String args[]) {
tentarFTP(args);
System.exit(0);
}



public static void tentarFTP(String args[]){

try {
String host = args[0];
String usuario = args[1];
String senha = args[2];
String arquivo = args[3];
String diretorio = args[4];
String modoTransf = args[5];
String modoCon = args[6];
// Conecta e testa host na porta 21

FTPClient ftp = new FTPClient(host, 21);
ftp.login(usuario, senha);
ftp.sair();
ftp = new FTPClient(host);
ftp.debugarRespostas(true);
ftp.login(usuario, senha);

if (modoTransf.equalsIgnoreCase("BINARY")) {
ftp.setarTipo(FTPTransferType.BINARY);
}else if (modoTransf.equalsIgnoreCase("ASCII")) {
ftp.setarTipo(FTPTransferType.ASCII);

} else {
System.out.println("Tipo de transferencia desconhecido: " + modoTransf);
System.exit(-1);
}

if (modoCon.equalsIgnoreCase("PASV")) {
ftp.setarModoCon(FTPConnectMode.PASV);
} else if (modoCon.equalsIgnoreCase("ACTIVE")) {
ftp.setarModoCon(FTPConnectMode.ACTIVE);
} else {
System.out.println("Modo de conexao desconhecido: " + modoCon);
System.exit(-1);
}

// metodo que entra no diretorio especificado
// com o comando cwd
ftp.escolherDiretorio(diretorio);
String[] listando;

// lista o arquivo passado como parametro
listando = ftp.listar(arquivo);

// faz um loop para pegar buscar os arquivos
for (int cont = 0 ; cont < listando.length; cont++){
arquivo = listando[cont];
System.out.println(arquivo);

// metodo que realiza download do arquivo passado
// como parametro. Este metodo cria o comando de 
// busca do arquivo via FTP, monta um buffer de
// escrita e vai criando o arquivo na maquina local
ftp.buscarArquivo(arquivo, arquivo);
ftp.setarTipo(FTPTransferType.ASCII);
}

arquivo = null;
ftp.sair();
} catch (IOException ex) {
System.out.println("Excecao capturada: " + ex.getMessage());
} catch (FTPException ex) {
System.out.println("Excecao capturada: " + ex.getMessage());
}
}
}

O seu problema eh classico e DIFICLIMO de perceber!

O problema eh o seguinte, voce ta escrevendo “.txt" na sua chamada do programa. O sistema operacional nao passa o "” para o java, ele substitui o “*.txt”, por todos os txts que estao no diretorio atual, entende?

O java simplesmente recebe uma linha diferente daquela que voce quer!!!

Para resolver isso, faca uma substituicao. por exemplo, use % como wildcard, e dentro do seu programa, voce susbstitui % por *

Tente usar o caractere de escape na frente do *:

java FTPClientTest 172.17.5.5 anonimo teste \*.txt arq/ ascii active

Muitas vezes, principalmente em sistemas baseados em UNIX, os parametros que voce passa sao interpretados pela shell, o que nao eh o desejado. Por exemplo, as vezes voce quer passar o caracter “&” ou “|”. Se for colocado normal, o sistema ira pensar q vc quer executar em segundo plano ou esta fazendo um named pipe, respectivamente. A solucao entao eh colocar entre aspas ou aspas duplas os caracteres ‘especiais’. O mesmo deve valer para o problema do “*”.

Por exemplo,


java FTPClientTest 172.17.5.5 anonimo teste "*.txt" arq/ ascii active 

[]'s
Rafael Steil

Obrigado pessoal. Agradeco desde ja. So lembrando que estou usando o Forte 3 e eu testei as tres formas e a que funcionou no framework foi o %. Testarei via console. Obrigado