2010-01-04 2 views
1

sftp 서버에있는 디렉토리에서 최신 파일을 가져 오려고합니다.Apache vfs : 디렉토리의 최신 변경된 파일을 가져옵니다 (sftp)

public FileObject getLatestFile(String directory) throws FileSystemException { 
    FileObject fo = fsManager.resolveFile(this.host+directory, fsOptions); 
    FileObject latestFile = null; 
    long max = 0; 
    fo.getContent(). 
    for (FileObject fob : fo.getChildren()){ 
     if (fob.getContent().getLastModifiedTime() > max) { 
      max = fob.getContent().getLastModifiedTime(); 
      latestFile = fob; 
     } 
    } 
    return latestFile; 
} 

이 방법의 문제는 기본적으로 내가 주어진 디렉토리에있는 모든 파일을 다운로드하고 있다는 것입니다, 매번 메서드를 호출 : 나는 지금 그것을 할 방법은 더 많거나 적은이다.

더 좋은 방법이 있습니까?

답변

3

콘텐츠를 다운로드하지 않습니다.

소스 코드를 보면 :의 getContent 그냥 객체 구현 및 크기와 같은 점점 속성을 반환 호출

/** 
* Returns the file's content. 
*/ 
public FileContent getContent() throws FileSystemException 
{ 
    synchronized (fs) 
    { 
     attach(); 
     if (content == null) 
     { 
      content = new DefaultFileContent(this, getFileContentInfoFactory()); 
     } 
     return content; 
    } 
} 

, 원격 폴더를 탐색 할 때 기본적으로이 추출 수정 날짜 (모든 프로토콜은 다르지만 예를 들어 FTP 폴더를 나열하면 모든 파일 속성을 가져옵니다. SFTP 실제로 부르는이 들어

:

동의
protected long doGetLastModifiedTime() throws Exception 
{ 
    if (attrs == null 
      || (attrs.getFlags() & SftpATTRS.SSH_FILEXFER_ATTR_ACMODTIME) == 0) 
    { 
     throw new FileSystemException(
       "vfs.provider.sftp/unknown-modtime.error"); 
    } 
    return attrs.getMTime() * 1000L; 
} 

, 실제로 이름이 혼란하고의 getContent가 호출 될 때 내용이 검색되는 것을 의미하지만 아니다.

+0

멋진 분석. 그래도 코드가 느리므로 왕복이 빚어지고 있다고 생각합니다. 감사합니다. –

+0

SftpFileObject.doListChildrenResolved를 보면 모든 자식은 생성시 속성이 채워집니다. ((SftpFileObject) FileObjectUtils.getAbstractFileObject (fo)). setStat (stat.getAttrs()); 그래서 우리는 항목 당 파일 속성을 검색 할 가능성을 배제 할 수 있습니다 (sfpt ls 명령은 이미 그것을 얻습니다). 왜 천천히, 어쩌면 tcpdump/Wireshark (Linux 도구)를 사용하여 추가 연결을하는지 확인할 수 있습니다. –

관련 문제