Session.SynchronizeDirectories Method
Synchronizes content of a local directory with a remote one or vice versa or mutually.
Advertisement
Syntax
public SynchronizationResult SynchronizeDirectories( SynchronizationMode mode, string localPath, string remotePath, bool removeFiles, bool mirror = false, SynchronizationCriteria criteria = SynchronizationCriteria.Time, TransferOptions options = null )
Public Function SynchronizeDirectories( mode As SynchronizationMode, localPath As String, remotePath As String, removeFiles As Boolean, Optional mirror As Boolean = False, Optional criteria As SynchronizationCriteria = SynchronizationCriteria.Time, Optional options As TransferOptions = Nothing ) As SynchronizationResult
Parameters
| Name | Description |
|---|---|
| SynchronizationMode mode | Synchronization direction. Possible values are SynchronizationMode.Local, SynchronizationMode.Remote and SynchronizationMode.Both. |
| string localPath | Full path to local directory. |
| string remotePath | Full path to remote directory. |
| bool removeFiles | When set to true, deletes obsolete files. Cannot be used for SynchronizationMode.Both. |
| bool mirror | When set to true, synchronizes in mirror mode (synchronizes also older files). Cannot be used for SynchronizationMode.Both. Defaults to false. |
| SynchronizationCriteria criteria | Comparison criteria. The parameter is a bit field of any of SynchronizationCriteria.Time (default), SynchronizationCriteria.Size and SynchronizationCriteria.Checksum. SynchronizationCriteria.None can be used as an alias to empty bit field. For backward compatibility, SynchronizationCriteria.Either can be used as an alias to Time | Size. For SynchronizationMode.Both, SynchronizationCriteria.Time can be used only. |
| TransferOptions options | Transfer options. Defaults to null, what is equivalent to new TransferOptions(). |
Advertisement
Return Value
SynchronizationResult. See also Capturing results of operations.
Exceptions
| Exception | Condition |
|---|---|
| InvalidOperationException | Session is not opened. |
| ArgumentException ArgumentOutOfRangeException |
Invalid combination of values of TransferOptions properties, SynchronizationMode, mirror or SynchronizationCriteria. |
| SessionLocalException | Error communicating with winscp.com. See the exception documentation for details. |
| TimeoutException | Timeout waiting for winscp.com to respond. |
Remarks
Event Session.FileTransferred is raised for every uploaded or downloaded file.
To further customize the synchronization, use instead a combination of Session.CompareDirectories and ComparisonDifference.Resolve. This allows synchronizing only selected differences, changing synchronization order or customizing error handling.
Examples
C# Example
using System; using WinSCP; class Example { public static int Main() { 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()) { // Will continuously report progress of synchronization session.FileTransferred += FileTransferred; // Connect session.Open(sessionOptions); // Synchronize files SynchronizationResult synchronizationResult; synchronizationResult = session.SynchronizeDirectories( SynchronizationMode.Remote, @"d:\www", "/home/martin/public_html", false); // Throw on any error synchronizationResult.Check(); } return 0; } catch (Exception e) { Console.WriteLine("Error: {0}", e); return 1; } } private static void FileTransferred(object sender, TransferEventArgs e) { if (e.Error == null) { Console.WriteLine("Upload of {0} succeeded", e.FileName); } else { Console.WriteLine("Upload of {0} failed: {1}", e.FileName, e.Error); } if (e.Chmod != null) { if (e.Chmod.Error == null) { Console.WriteLine( "Permissions of {0} set to {1}", e.Chmod.FileName, e.Chmod.FilePermissions); } else { Console.WriteLine( "Setting permissions of {0} failed: {1}", e.Chmod.FileName, e.Chmod.Error); } } else { Console.WriteLine("Permissions of {0} kept with their defaults", e.Destination); } if (e.Touch != null) { if (e.Touch.Error == null) { Console.WriteLine( "Timestamp of {0} set to {1}", e.Touch.FileName, e.Touch.LastWriteTime); } else { Console.WriteLine( "Setting timestamp of {0} failed: {1}", e.Touch.FileName, e.Touch.Error); } } else { // This should never happen during "local to remote" synchronization Console.WriteLine( "Timestamp of {0} kept with its default (current time)", e.Destination); } } }
Advertisement
VB.NET Example
Imports WinSCP Friend Class Example Public Shared Function Main() As Integer Try ' Setup session options Dim sessionOptions As New SessionOptions With sessionOptions .Protocol = Protocol.Sftp .HostName = "example.com" .UserName = "user" .Password = "mypassword" .SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxxxxxx..." End With Using session As New Session ' Will continuously report progress of synchronization AddHandler session.FileTransferred, AddressOf FileTransferred ' Connect session.Open(sessionOptions) ' Synchronize files Dim synchronizationResult As SynchronizationResult synchronizationResult = session.SynchronizeDirectories( SynchronizationMode.Remote, "d:\www", "/home/martin/public_html", False) ' Throw on any error synchronizationResult.Check() End Using Return 0 Catch e As Exception Console.WriteLine("Error: {0}", e) Return 1 End Try End Function Private Shared Sub FileTransferred(sender As Object, e As TransferEventArgs) If e.Error Is Nothing Then Console.WriteLine("Upload of {0} succeeded", e.FileName) Else Console.WriteLine("Upload of {0} failed: {1}", e.FileName, e.Error) End If If e.Chmod IsNot Nothing Then If e.Chmod.Error Is Nothing Then Console.WriteLine( "Permissions of {0} set to {1}", e.Chmod.FileName, e.Chmod.FilePermissions) Else Console.WriteLine( "Setting permissions of {0} failed: {1}", e.Chmod.FileName, e.Chmod.Error) End If Else Console.WriteLine("Permissions of {0} kept with their defaults", e.Destination) End If If e.Touch IsNot Nothing Then If e.Touch.Error Is Nothing Then Console.WriteLine( "Timestamp of {0} set to {1}", e.Touch.FileName, e.Touch.LastWriteTime) Else Console.WriteLine( "Setting timestamp of {0} failed: {1}", e.Touch.FileName, e.Touch.Error) End If Else ' This should never happen during "local to remote" synchronization Console.WriteLine( "Timestamp of {0} kept with its default (current time)", e.Destination) End If End Sub End Class
Advertisement
PowerShell Example
Learn more about using WinSCP .NET assembly from PowerShell.
# Load WinSCP .NET assembly Add-Type -Path "WinSCPnet.dll" # Session.FileTransferred event handler function FileTransferred { param($e) if ($e.Error -eq $Null) { Write-Host "Upload of $($e.FileName) succeeded" } else { Write-Host "Upload of $($e.FileName) failed: $($e.Error)" } if ($e.Chmod -ne $Null) { if ($e.Chmod.Error -eq $Null) { Write-Host "Permissions of $($e.Chmod.FileName) set to $($e.Chmod.FilePermissions)" } else { Write-Host "Setting permissions of $($e.Chmod.FileName) failed: $($e.Chmod.Error)" } } else { Write-Host "Permissions of $($e.Destination) kept with their defaults" } if ($e.Touch -ne $Null) { if ($e.Touch.Error -eq $Null) { Write-Host "Timestamp of $($e.Touch.FileName) set to $($e.Touch.LastWriteTime)" } else { Write-Host "Setting timestamp of $($e.Touch.FileName) failed: $($e.Touch.Error)" } } else { # This should never happen during "local to remote" synchronization Write-Host "Timestamp of $($e.Destination) kept with its default (current time)" } } # Main script try { $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 { # Will continuously report progress of synchronization $session.add_FileTransferred( { FileTransferred($_) } ) # Connect $session.Open($sessionOptions) # Synchronize files $synchronizationResult = $session.SynchronizeDirectories( [WinSCP.SynchronizationMode]::Remote, "d:\www", "/home/martin/public_html", $False) # Throw on any error $synchronizationResult.Check() } finally { # Disconnect, clean up $session.Dispose() } exit 0 } catch { Write-Host "Error: $($_.Exception.Message)" exit 1 }
Advertisement
JScript (WSH) Example
In this example the JScript script is embedded into WSF file, to allow access to enumeration values.
<job> <reference object="WinSCP.Session" /> <script language="JScript"> // Session.FileTransferred event handler function session_FileTransferred(sender, e) { if (e.Error == null) { WScript.Echo("Upload of " + e.FileName + " succeeded"); } else { WScript.Echo("Upload of " + e.FileName + " failed: " + e.Error); } if (e.Chmod != null) { if (e.Chmod.Error == null) { WScript.Echo( "Permissions of " + e.Chmod.FileName + " set to " + e.Chmod.FilePermissions); } else { WScript.Echo( "Setting permissions of " + e.Chmod.FileName + " failed: " + e.Chmod.Error); } } else { WScript.Echo("Permissions of " + e.Destination + " kept with their defaults"); } if (e.Touch != null) { if (e.Touch.Error == null) { WScript.Echo( "Timestamp of " + e.Touch.FileName + " set to " + e.Touch.LastWriteTime); } else { WScript.Echo( "Setting timestamp of " + e.Touch.FileName + " failed: " + e.Touch.Error); } } else { // This should never happen during "local to remote" synchronization WScript.Echo( "Timestamp of " + e.Destination + " kept with its default (current time)"); } } // Main script try { // Setup session options var sessionOptions = WScript.CreateObject("WinSCP.SessionOptions"); sessionOptions.Protocol = Protocol_Sftp; sessionOptions.HostName = "example.com"; sessionOptions.UserName = "user"; sessionOptions.Password = "mypassword"; sessionOptions.SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxxxxxx..."; var session = WScript.CreateObject("WinSCP.Session", "session_"); try { // Connect session.Open(sessionOptions); // Synchronize files var synchronizationResult = session.SynchronizeDirectories( SynchronizationMode_Remote, "D:\\www", "/home/martin/public_html", false); // Throw on any error synchronizationResult.Check(); } finally { // Disconnect, clean up session.Dispose(); } } catch (e) { WScript.Echo("Error: " + e.message); WScript.Quit(1); } </script> </job>
Advertisement