2009-02-03 25 views
8

org.apache.commons.net.ftp.FTPClient kullanıyorum ve davranışlarımı görüyorum.java'da FTPClient sınıfı ile ilgili sorun

Alttaki yöntem, bir FTPFile listesinden geçmeyi, bunları okuyup içeriğiyle bir şeyler yapmayı amaçlamaktadır. Hepsi çalışıyor.

1) Properly retrieves and stores the FIRST file in the list 
2) List item evaluates to NULL for x number of successive iterations of the loop (x varies on successive attempts 
3) manages to retrieve exactly 1 more file in the list 
4) reports that it is null for exactly 1 more file in the list 
5) hangs indefinitely, reporting no further activity. 

public static String mergeXMLFiles(List<FTPFile> files, String rootElementNodeName, FTPClient ftp){ 
     String ret = null; 
     String fileAsString = null; 
     //InputStream inStream; 
     int c; 

     if(files == null || rootElementNodeName == null) 
      return null; 
     try { 
      System.out.println("GETTING " + files.size() + " files"); 
      for (FTPFile file : files) { 
       fileAsString = ""; 
       InputStream inStream = ftp.retrieveFileStream(file.getName()); 

       if(inStream == null){ 
        System.out.println("FtpUtil.mergeXMLFiles() couldn't initialize inStream for file:" + file.getName()); 

        continue;//THIS IS THE PART THAT I SEE FOR files [1 - arbitrary number (usually around 20)] and then 1 more time for [x + 2] after [x + 1] passes successfully. 
       } 
       while((c = inStream.read()) != -1){ 

        fileAsString += Character.valueOf((char)c); 
       } 
       inStream.close(); 


       System.out.println("FILE:" + file.getName() + "\n" + fileAsString); 
      } 


     } catch (Exception e) { 
      System.out.println("FtpUtil.mergeXMLFiles() failed:" + e); 
     } 
     return ret; 
    } 

kimse böyle bir şey görmedi ... (gerçekten) çalışma FtpClient nesne takip yapmasıdır ne değildir? FTPClient için yeniyim, yanlış bir şey mi yapıyorum? Eğer neden başarısız görmek için cevap kodunu (örn getReplyCode(), getReplyString(), getReplyStrings()) kontrol etmelidir; bu durumda veri bağlantısı, açamıyor zaman

+0

yayınınızı düzenlemeyi böylece yerine sizin liste öğeleri için kod görünümünü kullanarak Could yerine liste öğeleri için sağlanan kısa numaralar kullanan? Bu şekilde daha okunabilir hale getirir :) – Kezzer

cevap

14

FTPClient.retrieveFileStream() API göre, yöntem null döndürür. Ayrıca, dosya aktarımlarını completePendingCommand() numaralı telefonu arayarak ve aktarımın gerçekten başarılı olduğunu doğrulayarak sonlandırmanız gerektiğini varsayalım. Ben eklediğinizde

+2

completePendingComand() !!!!! Siz bir beyefendi VE bir bilgin var Ben (tüm bağlantı önemsiz yaptığım önceki yöntemde) replyCode kontrol ediyordum ve tüm iyi çalışıyordu. CompletePendingCommand'ın önemini belirten belgeleri gözden kaçırdım. Çok teşekkürler. –

+0

Bu cevap için teşekkürler Zach Scrivena! Bu konuyla uzun süre sıkışmış oldu :) – krishnang

2

O "almak" komutundan sonra Tamam çalışır:

 int response = client.getReply(); 
     if (response != FTPReply.CLOSING_DATA_CONNECTION){ 
      //TODO 
     } 
İlgili konular