【问题标题】:Setting File filters when doing uploading and downloading of files in sshj v0.5.0在 sshj v0.5.0 中上传和下载文件时设置文件过滤器
【发布时间】:2011-09-19 07:53:50
【问题描述】:

我一直在使用 sshj 库

<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 时,代码给了我很多编译错误。

我想了解当我想从本地机器上传和下载文件到远程机器时如何设置文件过滤器,反之亦然

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: java sshj


    【解决方案1】:

    目前使用 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.6.0 的一部分吗?我尝试升级到 0.6.0,但我无法在其中找到 WildcardFileFilter 类:(.
    【解决方案2】:

    使用 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 来自 commons-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);
        }
    }
    

    【讨论】:

    • 在查看 org.apache.commons.io.filefilter.WildcardFileFilter.accept(File) 的实际实现后,我最终做了同样的事情。非常感谢帮助我回答...感谢您的帮助 Jeroen
    猜你喜欢
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2017-10-06
    • 2012-10-18
    • 1970-01-01
    • 2011-08-16
    相关资源
    最近更新 更多