2011-09-19 21 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类:(。 –