2

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

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

有人可以帮我吗?

4

2 回答 2

3

目前使用 0.5.0 这不再可能。我为 SSHJ 的 Shikhar(维护者)创建了一个拉取请求。

下面我调整了您的代码示例,使其适用于 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 中执行此操作的第二个答案。

希望这可以帮助。

于 2011-09-26T10:05:36.140 回答
1

使用 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);
    }
}
于 2011-09-27T09:41:43.990 回答