2011-08-09 4 views
18

SFTP 서버에서 동적 파일 이름을 가진 여러 .CSV 파일을 읽어야합니다. 이 파일은 15 분마다 생성됩니다.JSch ChannelSftp 사용 : 동적 이름을 사용하여 여러 파일을 읽는 방법?

JSch의 ChannelSftp를 사용하고 있지만 정확한 파일 이름을 제공 할 방법이 없습니다. 난 단지 .ls() 방법을 참조하십시오. 예를 들어 벡터를 제공합니다.

[drwxr-xr-x 2 2019  2019   144 Aug 9 22:29 ., 
drwx------ 6 2019  2019   176 Aug 27 2009 .., 
-rw-r--r-- 1 2019  2019   121 Aug 9 21:03 data_task1_2011_TEST.csv, 
-rw-r--r-- 1 2019  2019   121 Aug 9 20:57 data_task1_20110809210007.csv] 

디렉토리의 모든 파일을 읽고 다른 위치로 복사하는 간단한 방법이 있습니까?

이 코드는 하나의 파일을 복사하는 작업 :

JSch jsch = new JSch(); 
session = jsch.getSession(SFTPUSER,SFTPHOST,SFTPPORT); 
session.setPassword(SFTPPASS); 
java.util.Properties config = new java.util.Properties(); 
config.put("StrictHostKeyChecking", "no"); 
session.setConfig(config); 
session.connect(); 
channel = session.openChannel("sftp"); 
channel.connect(); 
channelSftp = (ChannelSftp)channel; 
channelSftp.cd(SFTPWORKINGDIR); 
channelSftp.get("data_task1_20110809210007.csv","data_task1_20110809210007.csv"); 

답변

44

ls 방법은 당신이 필요로하는 것입니다. LsEntry 개체의 벡터를 반환하며 각 개체의 이름을 물어볼 수 있습니다.

그래서, 당신의 channelSftp.cd(SFTPWORKINGDIR); 후, 다음을 수행 할 수 : (. Windows의이 destinationPath/로 끝나는 로컬 디렉토리 이름입니다 가정 (또는 \))

Vector<ChannelSftp.LsEntry> list = channelSftp.ls("*.cvs"); 
for(ChannelSftp.LsEntry entry : list) { 
    channelSftp.get(entry.getFilename(), destinationPath + entry.getFilename()); 
} 

물론

, 15 분 후에 동일한 파일을 다시 다운로드하지 않으려면 로컬 파일 목록을 가지고 비교하거나 (HashSet 등을 사용하거나) 서버에서 파일을 삭제할 수 있습니다.

+0

감사 Paŭlo Ebermann. 그것은 빠릅니다. 당신의 도움을 주셔서 감사합니다. – pingu

+2

[내 관찰 태그] (http://stackexchange.com/filters/19305/palos-filter)에'jsch'가있어서 운이 좋았습니다. 기꺼이 도와주세요. –

+0

이 코드는 jsch 1.49에도 여전히 적용됩니까? – ides

2

ls은 대소 문자를 구분합니다. 이 메서드는 확장 사례에 관계없이 모든 CSV 파일을 검색합니다.

ArrayList<String> list = new ArrayList<String>(); 
Vector<LsEntry> entries = sftpChannel.ls("*.*"); 
for (LsEntry entry : entries) { 
    if(entry.getFilename().toLowerCase().endsWith(".csv")) { 
     list.add(entry.getFilename()); 
    } 
} 
관련 문제