From 072ba7e01323659d5ee12a59b6cb4f7cf583d64e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Nag=C3=B3rski?= Date: Mon, 22 May 2023 09:47:09 +0200 Subject: [PATCH] Remove FEATURE_DIRECTORYINFO_ENUMERATEFILES (#1119) * Remove FEATURE_DIRECTORYINFO_ENUMERATEFILES * Add exception documentation --- .../Abstractions/FileSystemAbstraction.cs | 32 ------- src/Renci.SshNet/Renci.SshNet.csproj | 4 +- src/Renci.SshNet/SftpClient.cs | 90 +++++++++++-------- 3 files changed, 54 insertions(+), 72 deletions(-) delete mode 100644 src/Renci.SshNet/Abstractions/FileSystemAbstraction.cs diff --git a/src/Renci.SshNet/Abstractions/FileSystemAbstraction.cs b/src/Renci.SshNet/Abstractions/FileSystemAbstraction.cs deleted file mode 100644 index 1bce391ed..000000000 --- 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 2f39c80ec..21b0128a8 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 2705382ad..937f4a1a0 100644 --- a/src/Renci.SshNet/SftpClient.cs +++ b/src/Renci.SshNet/SftpClient.cs @@ -1996,6 +1996,7 @@ public void SetAttributes(string path, SftpFileAttributes fileAttributes) /// 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 @@ public IEnumerable SynchronizeDirectories(string sourcePath, string de /// /// 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 @@ private IEnumerable InternalSynchronizeDirectories(string sourcePath, var sourceDirectory = new DirectoryInfo(sourcePath); - var sourceFiles = FileSystemAbstraction.EnumerateFiles(sourceDirectory, searchPattern).ToList(); - if (sourceFiles.Count == 0) - return uploadedFiles; + using (var sourceFiles = sourceDirectory.EnumerateFiles(searchPattern).GetEnumerator()) + { + if (!sourceFiles.MoveNext()) + { + return uploadedFiles; + } - #region Existing Files at The Destination + #region Existing Files at The Destination - var destFiles = InternalListDirectory(destinationPath, null); - var destDict = new Dictionary(); - foreach (var destFile in destFiles) - { - if (destFile.IsDirectory) - continue; - destDict.Add(destFile.Name, destFile); - } + var destFiles = InternalListDirectory(destinationPath, null); + var destDict = new Dictionary(); + foreach (var destFile in destFiles) + { + if (destFile.IsDirectory) + { + continue; + } - #endregion + destDict.Add(destFile.Name, destFile); + } - #region Upload the difference + #endregion - const Flags uploadFlag = Flags.Write | Flags.Truncate | Flags.CreateNewOrOpen; - foreach (var localFile in sourceFiles) - { - var isDifferent = !destDict.ContainsKey(localFile.Name); + #region Upload the difference - if (!isDifferent) + const Flags uploadFlag = Flags.Write | Flags.Truncate | Flags.CreateNewOrOpen; + do { - 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; - } + var localFile = sourceFiles.Current; + if (localFile == null) + { + continue; + } - if (isDifferent) - { - var remoteFileName = string.Format(CultureInfo.InvariantCulture, @"{0}/{1}", destinationPath, localFile.Name); - try + var isDifferent = true; + if (destDict.TryGetValue(localFile.Name, out var remoteFile)) { - using (var file = File.OpenRead(localFile.FullName)) + // 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 { - InternalUploadFile(file, remoteFileName, uploadFlag, null, null); - } + using (var file = File.OpenRead(localFile.FullName)) + { + InternalUploadFile(file, remoteFileName, uploadFlag, null, null); + } - uploadedFiles.Add(localFile); + uploadedFiles.Add(localFile); - if (asynchResult != null) + if (asynchResult != null) + { + asynchResult.Update(uploadedFiles.Count); + } + } + catch (Exception ex) { - asynchResult.Update(uploadedFiles.Count); + throw new SshException($"Failed to upload {localFile.FullName} to {remoteFileName}", ex); } } - catch (Exception ex) - { - throw new Exception(string.Format("Failed to upload {0} to {1}", localFile.FullName, remoteFileName), ex); - } } + while (sourceFiles.MoveNext()); } #endregion