Настройка файловых фильтров при загрузке и скачивании файлов в sshj v0.5.0 - PullRequest
2 голосов
/ 19 сентября 2011

Я использую библиотеки 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, когда я хочу загружать и скачивать файлы с локального на удаленный компьютер и наоборот

Может кто-нибудь, пожалуйста, помогите мне с этим?

Ответы [ 2 ]

3 голосов
/ 26 сентября 2011

В настоящее время с использованием 0.5.0 это больше невозможно.Я создал запрос pull для Shikhar (сопровождающего) SSHJ.

Ниже я адаптировал ваш пример кода, чтобы он работал с 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.

Надеюсь, это поможет.

1 голос
/ 27 сентября 2011

Используя 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);
    }
}
...