diff --git a/src/Renci.SshNet/Abstractions/FileSystemAbstraction.cs b/src/Renci.SshNet/Abstractions/FileSystemAbstraction.cs
deleted file mode 100644
index 1bce391e..00000000
--- a/src/Renci.SshNet/Abstractions/FileSystemAbstraction.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-
-namespace Renci.SshNet.Abstractions
-{
- internal class FileSystemAbstraction
- {
- ///
- /// Returns an enumerable collection of file information that matches a search pattern.
- ///
- ///
- /// The search string to match against the names of files.
- ///
- /// An enumerable collection of files that matches .
- ///
- /// is null.
- /// is null.
- /// The path represented by does not exist or is not valid.
- public static IEnumerable EnumerateFiles(DirectoryInfo directoryInfo, string searchPattern)
- {
- if (directoryInfo == null)
- throw new ArgumentNullException("directoryInfo");
-
-#if FEATURE_DIRECTORYINFO_ENUMERATEFILES
- return directoryInfo.EnumerateFiles(searchPattern);
-#else
- return directoryInfo.GetFiles(searchPattern);
-#endif
- }
- }
-}
diff --git a/src/Renci.SshNet/Renci.SshNet.csproj b/src/Renci.SshNet/Renci.SshNet.csproj
index 2f39c80e..21b0128a 100644
--- a/src/Renci.SshNet/Renci.SshNet.csproj
+++ b/src/Renci.SshNet/Renci.SshNet.csproj
@@ -5,7 +5,7 @@
false
Renci.SshNet
../Renci.SshNet.snk
- 6
+ 7.3
true
net462;netstandard2.0;net6.0;net7.0
@@ -19,6 +19,6 @@
- FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_SOCKET_TAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_EAP;FEATURE_DNS_SYNC;FEATURE_DNS_APM;FEATURE_DNS_TAP
+ FEATURE_SOCKET_TAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_EAP;FEATURE_DNS_SYNC;FEATURE_DNS_APM;FEATURE_DNS_TAP
diff --git a/src/Renci.SshNet/SftpClient.cs b/src/Renci.SshNet/SftpClient.cs
index 2705382a..937f4a1a 100644
--- a/src/Renci.SshNet/SftpClient.cs
+++ b/src/Renci.SshNet/SftpClient.cs
@@ -1996,6 +1996,7 @@ namespace Renci.SshNet
/// is null.
/// is null or contains only whitespace.
/// was not found on the remote host.
+ /// If a problem occurs while copying the file
public IEnumerable SynchronizeDirectories(string sourcePath, string destinationPath, string searchPattern)
{
if (sourcePath == null)
@@ -2019,6 +2020,7 @@ namespace Renci.SshNet
///
/// is null.
/// is null or contains only whitespace.
+ /// If a problem occurs while copying the file
public IAsyncResult BeginSynchronizeDirectories(string sourcePath, string destinationPath, string searchPattern, AsyncCallback asyncCallback, object state)
{
if (sourcePath == null)
@@ -2074,60 +2076,72 @@ namespace Renci.SshNet
var sourceDirectory = new DirectoryInfo(sourcePath);
- var sourceFiles = FileSystemAbstraction.EnumerateFiles(sourceDirectory, searchPattern).ToList();
- if (sourceFiles.Count == 0)
- return uploadedFiles;
-
- #region Existing Files at The Destination
-
- var destFiles = InternalListDirectory(destinationPath, null);
- var destDict = new Dictionary();
- foreach (var destFile in destFiles)
+ using (var sourceFiles = sourceDirectory.EnumerateFiles(searchPattern).GetEnumerator())
{
- if (destFile.IsDirectory)
- continue;
- destDict.Add(destFile.Name, destFile);
- }
-
- #endregion
-
- #region Upload the difference
-
- const Flags uploadFlag = Flags.Write | Flags.Truncate | Flags.CreateNewOrOpen;
- foreach (var localFile in sourceFiles)
- {
- var isDifferent = !destDict.ContainsKey(localFile.Name);
-
- if (!isDifferent)
+ if (!sourceFiles.MoveNext())
{
- var temp = destDict[localFile.Name];
- // TODO: Use md5 to detect a difference
- //ltang: File exists at the destination => Using filesize to detect the difference
- isDifferent = localFile.Length != temp.Length;
+ return uploadedFiles;
}
- if (isDifferent)
+ #region Existing Files at The Destination
+
+ var destFiles = InternalListDirectory(destinationPath, null);
+ var destDict = new Dictionary();
+ foreach (var destFile in destFiles)
{
- var remoteFileName = string.Format(CultureInfo.InvariantCulture, @"{0}/{1}", destinationPath, localFile.Name);
- try
+ if (destFile.IsDirectory)
{
- using (var file = File.OpenRead(localFile.FullName))
- {
- InternalUploadFile(file, remoteFileName, uploadFlag, null, null);
- }
-
- uploadedFiles.Add(localFile);
-
- if (asynchResult != null)
- {
- asynchResult.Update(uploadedFiles.Count);
- }
+ continue;
}
- catch (Exception ex)
+
+ destDict.Add(destFile.Name, destFile);
+ }
+
+ #endregion
+
+ #region Upload the difference
+
+ const Flags uploadFlag = Flags.Write | Flags.Truncate | Flags.CreateNewOrOpen;
+ do
+ {
+ var localFile = sourceFiles.Current;
+ if (localFile == null)
{
- throw new Exception(string.Format("Failed to upload {0} to {1}", localFile.FullName, remoteFileName), ex);
+ continue;
+ }
+
+ var isDifferent = true;
+ if (destDict.TryGetValue(localFile.Name, out var remoteFile))
+ {
+ // TODO: Use md5 to detect a difference
+ //ltang: File exists at the destination => Using filesize to detect the difference
+ isDifferent = localFile.Length != remoteFile.Length;
+ }
+
+ if (isDifferent)
+ {
+ var remoteFileName = string.Format(CultureInfo.InvariantCulture, @"{0}/{1}", destinationPath, localFile.Name);
+ try
+ {
+ using (var file = File.OpenRead(localFile.FullName))
+ {
+ InternalUploadFile(file, remoteFileName, uploadFlag, null, null);
+ }
+
+ uploadedFiles.Add(localFile);
+
+ if (asynchResult != null)
+ {
+ asynchResult.Update(uploadedFiles.Count);
+ }
+ }
+ catch (Exception ex)
+ {
+ throw new SshException($"Failed to upload {localFile.FullName} to {remoteFileName}", ex);
+ }
}
}
+ while (sourceFiles.MoveNext());
}
#endregion