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 xxxxxxxxxxx..." } $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.GetFileToDirectory($latest.FullName, $localPath) | Out-Null } 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 xxxxxxxxxxx...", }; 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.GetFileToDirectory(latest.FullName, localPath); } return 0; } catch (Exception e) { Console.WriteLine("Error: {0}", e); return 1; } } }
Advertisement
VB.NET
The following snippet selects the most recent file from a directory listing. Most of the remaining code should be trivial to translate from the above C# example.
Dim latest As RemoteFileInfo = directoryInfo.Files _ .Where(Function(file) Not file.IsDirectory) _ .OrderByDescending(Function(file) file.LastWriteTime) _ .FirstOrDefault()
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 the
today
keyword in the file mask; e.g.get -filemask="*>=today" /home/user/*
, or an equivalent in .NET assembly). - If you need to download all files that were not downloaded yet, but you do not keep local copies of the files to synchronize the remote directory against, see Remember already downloaded files so they are not downloaded again.