JAKARTAPROJECT
JAKARTA TIPJSP TIPJSP 질문&답변DATABASE TIPJAVASCRIPT TIPWEBHACKING TIP기타 TIP
자카르타 프로젝트
자카르타 프로젝트
자카르타 프로젝트 팁 게시판 입니다
listFiles() 에서 null 을 반환 추적..
신만두
이미지 슬라이더 보기

1.4.1 버전 받아서 테스트 해보고 있습니다.

<파일리스트>

-rw-r--r--   1 jeus     jeus        4245 10월 31일  09:17 .profile
-rw-rw-r--   1 jeus     jeus        4486 10월 23일  16:09 .profile715006224
-rw-rw-r--   1 jeus     jeus        4856 10월 23일  16:16 .profile974565758
-rw-------   1 jeus     jeus          22 10월 21일  16:30 .sh_history
-rw-------   1 jeus     jeus          36 11월 11일  10:41 dead.letter
drwxr-xr-x   7 jeus     jeus         512 11월  5일  15:37 easy_npl
drwxr-xr-x   3 jeus     jeus         512 2007년 10월  4일 emi
drwxr-xr-x  15 jeus     jeus         512 10월 23일  17:40 jeus5

<소스코드>

FTPClientConfig config = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
config.setServerLanguageCode("ko");
config.setDefaultDateFormatStr("yyyy년 M월 d일");
config.setRecentDateFormatStr("M월 d일 HH:mm");
ftpClient.configure(config);
ftpClient.setControlEncoding("euc-kr");

 

FTPFile[] ftpfiles = ftpClient.listFiles();
for(int i = 0; i < ftpfiles.length; i++){
    if( ftpfiles[i] != null ){
        System.out.println("[File name]=" + ftpfiles[i].toString());
    }
    else{
        System.out.println("[File name]= null");
    }
}

 

문제는 이렇게 설정하여도 위의 리스트처럼 최근 파일 "월일 시간:분" 으로 표시되는 리스트는 잘 가져오지만

"년월일" 형식으로 표시되는 리스트는 null 로 반환합니다.

 

아파치가서 1.4.1 소스코드 받아서 추적해봤더니

   org.apache.commons.net.ftp.parser 패키지 --> UnixFTPEntryParser.java 에서 -->

     public FTPFile parseFTPEntry(String entry) -->

         if (matches(entry)){    이부분을 실행하면서 REGEX 를 수행하여 패턴 매치을 하더군요.

 

패턴매치를 수행할때는 UNIX 의 경우 위 java 파일에서 정의된 아래의 REGEX 를 참고합니다.

 

    private static final String REGEX =
        "([bcdlfmpSs-])"
        +"(((r|-)(w|-)([xsStTL-]))((r|-)(w|-)([xsStTL-]))((r|-)(w|-)([xsStTL-])))\\+?\\s+"
        + "(\\d+)\\s+"
        + "(\\S+)\\s+"
        + "(?:(\\S+)\\s+)?"
        + "(\\d+)\\s+"
       
        /*
          numeric or standard format date
        */
        + "((?:\\d+[-/]\\d+[-/]\\d+)|(?:\\S+\\s+\\S+))\\s+"
  
        /*
           year (for non-recent standard format)
     or time (for numeric or recent standard format 
  */
  + "(\\d+(?::\\d+)?)\\s+"
        
  + "(\\S*)(\\s*.*)";

 

이 패턴매칭을 위한 REGEX 가 매칭을 할때 

       -rw-r--r--   1 jeus     jeus        4245 10월 31일  09:17 .profile

와 같은 패턴은 매칭을 하나 아래의 패턴은

       drwxr-xr-x   3 jeus     jeus         512 2007년 10월  4일 emi

매칭을 못합니다. 그래서 결국 null 을 리턴하더군요.

 

그래서 해결방법으로 REGEX 에서 패턴매칭을 정확하게 분기하서 짜던가 위 두가지 케이스의 패턴을 패턴매칭하도록

REGEX 를 다시 짰습니다.

(변경전)

   + "((?:\\d+[-/]\\d+[-/]\\d+)|(?:\\S+\\s+\\S+))\\s+"

   + "(\\d+(?::\\d+)?)\\s+"

(변경후)
   + "((?:\\d+\\S?\\s+\\d+\\S?\\s+\\d+\\S?)|(?:\\d+[-/]\\d+[-/]\\d+)|(?:\\S+\\s+\\S+))\\s+"

   + "((?:\\d+:\\d+)\\s+|)"

 

이렇게 REGEX 를 변경하여 실행하였더니 패턴매칭에서 값을 가져오더군요.(패턴 매칭할때 아래 코드의 그룹값에 맞게 짤려지게끔 패턴 매칭을 짰습니다.) 근데 리스트는 계속 null 이더라구요. 그래서 다시 추적해봤더니

 

        if (matches(entry))
        {
            String typeStr = group(1);
            String hardLinkCount = group(15);
            String usr = group(16);
            String grp = group(17);
            String filesize = group(18);
            String datestr = group(19) + " " + group(20);
            String name = group(21);
            String endtoken = group(22);
           
            try
            {
                file.setTimestamp(super.parseTimestamp(datestr));
            }
            catch (ParseException e)
            {
             return null;  // this is a parsing failure too.
            }


 

이렇게 매치된 패턴에서 그룹을 가져오고 나서

org.apache.commons.net.ftp.parser 내의 FTPTimestampParserImpl.java 파일의 --> parseTimestamp() 이메소드 내의

if (parsed != null && pp.getIndex() == timestampStr.length())  이부분에서 실제 설정된 길이가 한개씩 모자랍니다.

 

코드를 살펴보니 String datestr = group(19) + " " + group(20); 에서 스페이스가 딸려가는거 같아서   바로아래에 datestr = datestr.trim(); 이렇게 처리해주고 나서 실행했더니 리스트에 모든건이 보입니다. ㅡㅡ;; 아 노가다여..

 

 

하수가 파악한 상황을 잊어버릴까봐 이렇게 적어봅니다. ^^;;;

2008-11-11 19:20:49
211.189.27.***
자바에 관심이 굉장히 많습니다. ^^
0점 (0명)
덧글 0개 | 태그 0개 | 관련글보기
태그입력
쉽표(,)구분으로 한번에 여러 태그를 입력할수 있습니다
이름 비밀번호
자카르타 프로젝트
자카르타 프로젝트 팁 게시판 입니다
! 번호 제목 글쓴이 일자 조회
Hierarchy of the Apache Software Foundation GoodBug 2005-10-14 10,740
Jakarta Project 강좌 게시판입니다 8 GoodBug 2005-04-03 11,613
44 Log4J log4j에서 e.printStackTrace() 메시지를 log에 남기는 방법 1 kaiser 2008-10-22 17,546
43 DBUtils DBUtils에서 Clob 사용하기 3 1 GoodBug 2007-08-28 10,568
42 Spring Spring 설정 파일 로딩 1 GoodBug 2007-07-16 11,252
41 POI POI의 HSLF를 이용하여 PowerPoint 문서를 읽어보자 2 GoodBug 2007-05-28 14,836
40 POI POI의 HWPF를 이용하여 MS WORD문서를 읽어보자 2 GoodBug 2007-05-28 16,757
39 Validator Validator 속성들 1 GoodBug 2007-05-11 10,328
38 dd Commons-Fileupload 1.2 1 2 GoodBug 2007-04-23 15,266
37 Apache Apache2 + Tomcat5.5 + mod_jk 4 바이러스天国 2007-01-29 10,969
36 DBUtils DBUtils에서 number 타입의 컬럼이 int형으로 안넘어올때.. 3 1 GoodBug 2006-06-28 10,678
35 흠흠 위험한 static Logger 필드... 2 1 서연아빠 2006-03-16 10,050
34 Installing Tomcat with commons-daemon (jsvc) GoodBug 2006-01-08 9,004
33 commons Commons DbUtils 몇가지 예제 3 2 GoodBug 2005-11-17 15,123
32 commons Jakarta Commons Net 에서 FTP 사용시 목록이 안보일 경우 2 GoodBug 2005-11-15 21,698
listFiles() 에서 null 을 반환 추적.. 신만두 2008-11-11 11,769
30 commons 목록이 안보일 경우 해결기 I탄 1 2 GoodBug 2005-12-23 15,858
29 POI POI로 엑셀파일 읽을때, Invalid header signature 에러 1 GoodBug 2005-11-12 16,467
28 log4j log4j, JSP에서 원하는 Appender 골라쓰기 1 GoodBug 2005-11-07 13,824
27 commons Commons-Email~ 7 2 GoodBug 2005-10-13 17,786
copyright 2005-2017 by Unicorn