Aew galera estou tendo um problema com o apache FTP, fiz um teste em outro servidor Windows 2008 e funcionou normal, agora quando tento listar os arquivos de certo servidor me da o seguinte erro
Exception in thread "AWT-EventQueue-0" org.apache.commons.net.ftp.parser.ParserInitializationException: Unknown parser type: WIN32
eu consigo conectar normalmente mas na hora de chamar o metodo .listFiles() ele me da esse erro.
Alguem pode me ajudar é urgente.
Obrigado.
Talvez se você colocasse aqui o trecho onde você se conecta e faz as requisições ficasse mais fácil de ajudar.
[code]try {
FTPClient ftp = FTPConexao.conectar();
System.out.println(ftp.printWorkingDirectory());
System.out.println(ftp.printWorkingDirectory());
String[] st = ftp.listNames();
System.out.println(st.length);
System.out.println(st[0]);
if(null == ftp.getSystemName()) {
ftp.listFiles((String)null);
} else {
ftp.listFiles();
}
System.out.println(ftp.getSystemName());
/* FTPFile[] files = ftp.listFiles("/angelica");
System.out.println(files.length);*/
} catch (SocketException ex) {
Logger.getLogger(teste.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(teste.class.getName()).log(Level.SEVERE, null, ex);
}[/code]
Aqui o metodo de conexao
[code]public static FTPClient conectar() throws SocketException, IOException {
if (ftp == null) {
ftp = new FTPClient();
ftp.connect("ftp.xxxx.com.br");
ftp.login("xxxx.com.br", "xxxx");
}
return ftp;
}[/code]
Eu consigo conectar e listar os nomes normalmente o problema esta na hora que eu chamo o metodo listFiles, o servidor que estou tentando acessar eh Windows tanto que o getSystemName() é WIN32
ja testei em outro servidor e funciona normal o que pode ser
Erro
Exception in thread "AWT-EventQueue-0" org.apache.commons.net.ftp.parser.ParserInitializationException: Unknown parser type: WIN32
at org.apache.commons.net.ftp.parser.DefaultFTPFileEntryParserFactory.createFileEntryParser(DefaultFTPFileEntryParserFactory.java:132)
at org.apache.commons.net.ftp.FTPClient.initiateListParsing(FTPClient.java:2263)
at org.apache.commons.net.ftp.FTPClient.listFiles(FTPClient.java:2046)
at org.apache.commons.net.ftp.FTPClient.listFiles(FTPClient.java:2093)
Andei pesquisando e encontrei as classes de configuração mas mesmo assim nao deu certo
[code]public class TesteFTP {
public static void main(String[] args) throws SocketException, IOException {
FTPClient ftp = new FTPClient();
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
// conf.setServerTimeZoneId(“America/Denver”);
ftp.configure(conf);
ftp.connect("ftp.coloradocontabilidade.com.br");
checkReply(ftp, "FTP server refused connection.");
System.out.println("Conectando-se");
ftp.login("coloradoangelica.com.br", "24FebXTarA7d");
checkReply(ftp, "FTP server refused login.");
//System.out.println("Usuario: anonymous e senha em brancos");
//ftp.changeWorkingDirectory("SakPatch");
//System.out.println("Mudando para o diretório do sakray");
String[] arquivos = ftp.listNames();
checkReply(ftp, "FTP server refused listing names.");
for (int i = 0; i < arquivos.length; i++) {
System.out.println(arquivos[i]);
}
FTPFile[] files = ftp.listFiles();
checkReply(ftp, "FTP server refused listing files");
for (int i = 0; i < files.length; i++) {
System.out.println(files[i].getName());
System.out.println(files[i].getSize());
}
}
private static void checkReply(FTPClient ftp, String message) throws IOException {
System.out.println(ftp.getReplyString());
int reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
System.err.println(message);
System.exit(1);
}
}
}[/code]
mas dessa forma nao da erro, mas ele apenas lista os nomes no primeiro metodo
[quote=furacao123]
mas dessa forma nao da erro, mas ele apenas lista os nomes no primeiro metodo[/quote]
E não é isso que esse trecho deveria fazer?
Primeiro lista os nomes e depois os arquivos, e o laço faz mostrar os nomes de cada arquivo no caso só é executado o primeiro metodo
String[] arquivos = ftp.listNames();
Consegui resolver setando um ParserEngine, dei uma pesquisada mas ainda não entendi direito a necessidade de fazer isso, pois em outro servidor o programa acesava normalmente o ftp sem isso.
Era um servidor Linux mas testei tambem em outro windows e funcionou agora esse que preciso acessar tive que incluir esse parserEngine da seguinte forma
FTPClient ftp = FTPConexao.conectar();
FTPListParseEngine engine = ftp.initiateListParsing("org.apache.commons.net.ftp.parser.EnterpriseUnixFTPFileEntryParser", (String)null);
FTPFile[] listaArquivos = engine.getFiles();
mas cada vez que eu executo changeWorkingDirectory() eu preciso atribuir o valor novamento para o engine
engine = ftp.initiateListParsing("org.apache.commons.net.ftp.parser.EnterpriseUnixFTPFileEntryParser", ftp.printWorkingDirectory());
agora as duvidas são, porque eu tive que criar esse engine e como ele funcionou com essa config EnterpriseUnixFTPFileEntryParser se o servidor é WIN32 ?
se alguem puder esclarecer minhas duvidas agradeço, mas lembrando que assim resolvi o problema.
Obrigado.