diff --git a/reference/SshBasics/SFtpMT2.cpp b/reference/SshBasics/SFtpMT2.cpp new file mode 100644 index 000000000..e74772d2f --- /dev/null +++ b/reference/SshBasics/SFtpMT2.cpp @@ -0,0 +1,36 @@ +#include "SshBasics.h" + +// SFtpAsyncGet2: Demonstrates multiple file downloads, using a parallelization loop. + + +void SFtpAsyncGet2(SshSession& session) +{ + const int MAXDOWNLOADS = 4; + const char *path = "/pub/example/"; + + SFtp::DirList ls; + { + // Get a remote dir listing. + SFtp browser(session); + if(!browser.ListDir(path, ls)) { + RLOG(browser.GetErrorDesc()); + return; + } + } + + // Filter the dir list. + auto files = FilterRange(ls, [](const SFtp::DirEntry& e) { return e.IsFile() && e.GetSize() <= 65536; }); + + // Loop over. + CoFor(min(files.GetCount(), MAXDOWNLOADS), [&files, &path, &session](int i){ + const SFtp::DirEntry& e = files[i]; + String fpath = AppendFileName(path, e.GetName()); + RLOG("Downloading " << fpath); + SFtp sftp(session); + String file = sftp.LoadFile(fpath); + if(sftp.IsError()) + RLOG(Format("Worker #%d: %s", sftp.GetId(), sftp.GetErrorDesc())); + else + RLOG("File " << e.GetName() << " is successfully downloaded."); + }); +} diff --git a/reference/SshBasics/SshBasics.h b/reference/SshBasics/SshBasics.h index dc0440a23..fb9300fa1 100644 --- a/reference/SshBasics/SshBasics.h +++ b/reference/SshBasics/SshBasics.h @@ -10,6 +10,7 @@ void SFtpGet(SshSession& session); void SFtpStreamGet(SshSession& session); void SFtpTransparency(SshSession& session); void SFtpAsyncGet(SshSession& session); +void SFtpAsyncGet2(SshSession& session); void ExecListDir(SshSession& session); void ExecAsyncListDir(SshSession& session); void ShellConsole(SshSession& session); diff --git a/reference/SshBasics/SshBasics.upp b/reference/SshBasics/SshBasics.upp index f3027f7ff..85646c638 100644 --- a/reference/SshBasics/SshBasics.upp +++ b/reference/SshBasics/SshBasics.upp @@ -18,6 +18,7 @@ file Tunnel.cpp, "Core MT examples" readonly separator, SFtpMT.cpp, + SFtpMT2.cpp, ExecMT.cpp, "Misc. examples" readonly separator, PickSemantics.cpp, diff --git a/reference/SshBasics/main.cpp b/reference/SshBasics/main.cpp index 950fadedf..5a471bdb1 100644 --- a/reference/SshBasics/main.cpp +++ b/reference/SshBasics/main.cpp @@ -42,6 +42,8 @@ CONSOLE_APP_MAIN SFtpTransparency(session); #elif defined(SSH_SFTP_MT) SFtpAsyncGet(session); +#elif defined(SSH_SFTP_MT_LOOP) + SFtpAsyncGet2(session); #elif defined(SSH_EXEC) ExecListDir(session); #elif defined(SSH_EXEC_MT)