중국어 FTP 환경 에서 comons - net, FTPClient. listFiles () 방법 으로 null 의 문제 및 해결 방법 을 되 돌려 줍 니 다.

프로젝트 에 서 는 FTP 에서 데 이 터 를 다운로드 해 야 하 며, 오픈 소스 의 comons - net 패 키 지 를 사용 합 니 다.실제 응용 프로그램 에서 문 제 를 발 견 했 습 니 다. 일부 서버 에 서 는 ftpClient. listFiles () 방법 을 호출 하면 파일 이름 을 포함 한 배열 을 되 돌려 주 고, 일부 서버 에 서 는 이 방법 으로 NULL 을 되 돌려 줍 니 다.그러나 ftpClient. list Names () 방법 은 경로 의 파일 이름 을 되 돌려 주 고 ftpClient. delete () 방법 도 파일 을 삭제 할 수 있 습 니 다.
명령 행 에 FTP 를 연결 하고 ls - l 을 실행 하면 데이터 날 짜 를 되 돌려 주 는 곳 이 이상 합 니 다.
인용 하 다.
-rw-rw-rw-  1 username nobody      145  6 월 22 16 시 56 xxxx. csv
drw-rw-rw-  1 username nobody      145  6 월 22 2010 bakdir
실패 원인 은 바로 여기 입 니 다. comons - net 패키지 의 FTPListParseEngine 은 socket 을 통 해 원 격 서버 정 보 를 얻 는 것 을 처리 합 니 다.ls – l 의 정 보 를 통 해 파일 이름, 파일 시간, 파일 크기, 파일 권한, 파일 작성 자 를 분석 합 니 다...
  public FTPFile[] getFiles() throws IOException {
    List tmpResults = new LinkedList();
    Iterator iter = this.entries.iterator();
    while (iter.hasNext()) {
      String entry = (String) iter.next();
      //     
      // commons-net        ,  Unix,WinNT      ,
      //            ,        ,       ,
      FTPFile temp = this.parser.parseFTPEntry(entry);
      tmpResults.add(temp);
    }
    return (FTPFile[]) tmpResults.toArray(new FTPFile[0]);
  }
 
  //listFiles      FTPListParseEngine,initiateListParsing  
  public FTPFile[] listFiles(String pathname) throws IOException{
    String key = null;
    FTPListParseEngine engine = initiateListParsing(key, pathname);
    return engine.getFiles();
  }

  public FTPListParseEngine initiateListParsing(String parserKey, String pathname) 
    throws IOException {
    if (__entryParser == null) {
      //   parserKey   deprecated ,    FTPClientConfig
      if (null != parserKey) {
        __entryParser = __parserFactory.createFileEntryParser(parserKey);
      } 
      //    FTPClientConfig,      ParseEngine
      else {
        if (null != __configuration) {
          __entryParser = __parserFactory.createFileEntryParser(__configuration);
        } 
        //      ,      ,    ParseEngine
        else {
          __entryParser = __parserFactory.createFileEntryParser(getSystemName());
        }
      }
    }
    return initiateListParsing(__entryParser, pathname);
  }

원인 을 찾 은 후, 우 리 는 목 표를 세우 고, 구체 적 으로 - rw - rw - rw - rw -  1 username nobody      145  6 월 22 16 시 56 xxxx. csv 한 줄 데이터
/**
 * <pre>
 *   IBM  FTP          
 * -rw-rw-rw-    1 chnnlftp nobody          145  6 22 16 56 finance_back_info_20100617150652.csv
 *      ,    ,    ,    ,      。
 * 
 *          !!
 * </pre>
 */
public class MyFTPEntryParser extends ConfigurableFTPFileEntryParserImpl {

  private Class clazz = MyFTPEntryParser.class;
  private Log log = LogFactory.getLog(clazz);

  /**
   *   FTP       
   */
  public FTPFile parseFTPEntry(String entry) {
    log.debug("    ,   : " + entry);

    FTPFile file = new FTPFile();
    file.setRawListing(entry);

    String[] temp = entry.split("\\s+");
    if (temp.length != 8) {
      return null;
    }
    String fileType = temp[0].substring(0, 1);
    if ("d".equals(fileType)) {
      file.setType(FTPFile.DIRECTORY_TYPE);
    } else {
      file.setType(FTPFile.FILE_TYPE);
      file.setSize(Integer.valueOf(temp[4]));
    }
    file.setName(temp[7]);
    file.setUser(temp[3]);

    Calendar date = Calendar.getInstance();
    Date fileDate;
    //   【6 22 2010】     
    if(temp[6].matches("\\d{4}")){
      try {
        fileDate = new SimpleDateFormat("yyyyMM dd")
            .parse(temp[6] + temp[5]);
      } catch (ParseException e) {
        throw new RuntimeException("      ", e);
      }
    //   【6 22 16 56】     
    } else {
      int yyyy = date.get(Calendar.YEAR);
      try {
        fileDate = new SimpleDateFormat("yyyyMM ddHH mm")
            .parse(yyyy + temp[5] + temp[6]);
      } catch (ParseException e) {
        throw new RuntimeException("      ", e);
      }
    }
    date.setTime(fileDate);
    file.setTimestamp(date);

    return file;
  }

  // =====================================================================
  //           FTP,            ,      FTP
  //      parseFTPEntry,        。
  // =====================================================================
  public MyFTPEntryParser() {
    this("");
  }

  public MyFTPEntryParser(String regex) {
    super("");
  }

  protected FTPClientConfig getDefaultConfiguration() {
    return new FTPClientConfig(clazz.getPackage().getName() 
      + clazz.getSimpleName(), "", "", "", "", "");
  }
}

//     ftpClient.listNames()   ,   
ftpClient.configure(new FTPClientConfig(package.MyFTPEntryParser));
// package.MyFTPEntryParser:        

참고:
http://www.blogjava.net/wodong/archive/2008/08/21/wodong.html

좋은 웹페이지 즐겨찾기