2011-09-19 49 views
2

我一直在使用sshj庫設置文件過濾器sshj v0.5.0做上傳文件的下載時

<dependency> 
    <groupId>net.schmizz</groupId> 
    <artifactId>sshj</artifactId> 
    <version>0.3.1</version> 
</dependency> 

其次是使用0.3.1這對於做支持通配符模式上傳文件工作得很好我的代碼。

SSHClient client = null; 
SCPUploadClient uploader = null; 
try { 
    client = getClient(); 
    uploader = client.newSCPFileTransfer().newSCPUploadClient(); 
    uploader.setFileFilter(new WildcardFileFilter(wildCardPattern)); 

    //determine the remote directory 
    File f = new File(localDirLocation); 
    String dir = remoteDirLocation + f.getName(); 
    uploader.copy(localDirLocation, remoteDirLocation); 
} catch (IOException e) { 
     //processing exceptions here 
} finally { 
    disconnectClient(client); 
} 

但現在的代碼給了我很多編譯錯誤,當我試圖移動到0.5.0。

我想知道我怎麼去設置文件過濾器,當我想要做的上傳文件的下載從本地到遠程計算機,反之亦然

是否有人可以幫助我?

回答

0

使用0.6.0您可以編寫代碼如下:

SSHClient client = null; 
SCPUploadClient uploader = null; 
try { 
    client = getClient(); 
    uploader = client.newSCPFileTransfer().newSCPUploadClient(); 
    uploader.setUploadFilter(new WildcardFileFilter(wildCardPattern)); 

    //determine the remote directory 
    File f = new File(localDirLocation); 
    String dir = remoteDirLocation + f.getName(); 
    uploader.copy(new FileSystemFile(localDirLocation), remoteDirLocation); 
} catch (IOException e) { 
    //processing exceptions here 
} finally { 
    disconnectClient(client); 
} 

您使用的WildcardFileFilter來自公共-io的我猜。由於這是一個的FilenameFilter,而不是一個LocalFileFilter,你可以非常簡單地實現這個爲:

public WildcardFileFilter implements LocalFileFilter { 
    private String wildcardPattern; 

    public WildcardFileFilter(String wildcardPattern) { 
     this.wildcardPattern = wildcardPattern; 
    } 

    @Override 
    public boolean accept(LocalSourceFile file) { 
     return FilenameUtils.wildcardMatchOnSystem(file.getName(), wildcardPattern); 
    } 
} 
+0

這是我看完org.apache.commons.io的實際實現後所做的同樣的事情。 filefilter.WildcardFileFilter.accept(File)..非常感謝您幫助我解答問題...感謝您的幫助Jeroen –

3

目前使用0.5.0這已不再可能。我爲SSHJ的Shikhar(維護者)創建了一個pull request

下面我已經調整了你的代碼示例,使它能夠在0.5.0下工作。基本的變化是您現在需要爲複製方法提供LocalSourceFile。爲了使SCPUploadClient只發送目錄的過濾內容成爲可能,我重寫了getChildren(LocalFileFilter)方法。

SSHClient client = null; 
SCPUploadClient uploader = null; 
try { 
    client = getClient(); 
    uploader = client.newSCPFileTransfer().newSCPUploadClient(); 
    File f = new File(localDirLocation); 
    FilteredFileSystemDirectory filteredDir = new FilteredFileSystemDirectory(f, new WildcardFileFilter()); 
    String dir = remoteDirLocation + f.getName(); 
    uploader.copy(filteredDir, remoteDirLocation); 
} catch (IOException e) { 
    //processing exceptions here 
} finally { 
    disconnectClient(client); 
} 

public class FilteredFileSystemDirectory extends FileSystemFile { 
    private final LocalFileFilter filter; 

    public FilteredFileSystemDirectory(File f, LocalFileFilter filter) { 
     super(f); 
     this.filter = filter; 
    } 

    @Override 
    public Iterable<? extends LocalSourceFile> getChildren(LocalFileFilter filter) 
     throws IOException { 
     return super.getChildren(filter); 
    } 

} 

對於WildcardFileFilter,請參閱我的第二個關於如何在0.6.0中執行此操作的答案。

希望這會有所幫助。

+0

非常感謝你對我的幫助與拉動。這是0.6.0的一部分嗎?我嘗試升級到0.6.0,但我無法在其中找到WildcardFileFilter類:(。 –