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 に移行しようとすると、コードで多くのコンパイル エラーが発生します。

ローカルマシンからリモートマシンへ、またはその逆にファイルのアップロードとダウンロードを行うときに、fileFilters を設定する方法を理解したいと思います。

誰かがこれで私を助けてくれますか?

4

2 に答える 2

3

現在 0.5.0 を使用すると、これはもはや不可能です。SSHJ の Shikhar (メンテナー) にプルリクエストを作成しました。

以下では、0.5.0 で動作するようにコード サンプルを調整しました。基本的な変更点は、copy メソッドに 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 でこれを行う方法に関する私の 2 番目の回答を参照してください。

お役に立てれば。

于 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 から来たと思います。これは LocalFileFilter ではなく FilenameFilter であるため、次のように非常に簡単に実装できます。

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 に答える