This is an old revision of the document!
Downloading the most recent file
Advertisement
Using WinSCP .NET Assembly
PowerShell
The following example uses WinSCP .NET assembly from a PowerShell script. If you have another preferred language, you can easily translate it.
param ( $localPath = "c:\downloaded\", $remotePath = "/home/user/" ) try { # Load WinSCP .NET assembly Add-Type -Path "WinSCPnet.dll" # Setup session options $sessionOptions = New-Object WinSCP.SessionOptions -Property @{ Protocol = [WinSCP.Protocol]::Sftp HostName = "example.com" UserName = "user" Password = "mypassword" SshHostKeyFingerprint = "ssh-rsa 2048 xx:xx:xx:xx:xx:xx:xx:xx..." } $session = New-Object WinSCP.Session try { # Connect $session.Open($sessionOptions) # Get list of files in the directory $directoryInfo = $session.ListDirectory($remotePath) # Select the most recent file $latest = $directoryInfo.Files | Where-Object { -Not $_.IsDirectory } | Sort-Object LastWriteTime -Descending | Select-Object -First 1 # Any file at all? if ($latest -eq $Null) { Write-Host "No file found" exit 1 } # Download the selected file $session.GetFiles( [WinSCP.RemotePath]::EscapeFileMask($latest.FullName), $localPath).Check() } finally { # Disconnect, clean up $session.Dispose() } exit 0 } catch { Write-Host "Error: $($_.Exception.Message)" exit 1 }
Advertisement
C#
using System; using System.Linq; using WinSCP; class Program { static int Main(string[] args) { try { // Setup session options SessionOptions sessionOptions = new SessionOptions { Protocol = Protocol.Sftp, HostName = "example.com", UserName = "user", Password = "mypassword", SshHostKeyFingerprint = "ssh-rsa 2048 xx:xx:xx:xx:xx:xx:xx:xx...", }; using (Session session = new Session()) { // Connect session.Open(sessionOptions); const string remotePath = "/home/user/"; const string localPath = @"C:\downloaded\"; // Get list of files in the directory RemoteDirectoryInfo directoryInfo = session.ListDirectory(remotePath); // Select the most recent file RemoteFileInfo latest = directoryInfo.Files .Where(file => !file.IsDirectory) .OrderByDescending(file => file.LastWriteTime) .FirstOrDefault(); // Any file at all? if (latest == null) { throw new Exception("No file found"); } // Download the selected file session.GetFiles( RemotePath.EscapeFileMask(latest.FullName), localPath).Check(); } return 0; } catch (Exception e) { Console.WriteLine("Error: {0}", e); return 1; } } }
Advertisement
Using WinSCP Scripting
Use the -latest
switch of the get
command:
get -latest /home/user/* c:\downloaded\
Alternatives
Some of following alternatives can be easier to implement or actually even more appropriate for your specific task:
- Synchronizing a remote directory to a local directory (using
synchronize local
in scripting; orSession.SynchronizeDirectories
withmode
parameter set toSynchronizationMode.Local
in .NET assembly); - Downloading all files created in the last 24 hours (using file mask
*>=1D
; e.g.get -filemask="*>=1D" /home/user/*
, or an equivalent in .NET assembly). - Downloading all files created today (using
%TIMESTAMP%
syntax to format file mask with today’s time constraint, e.g.get -filemask="*>=%TIMESTAMP#yyyy-mm-dd%" /home/user/*
, or an equivalent in .NET assembly).