Browse Source

Remove FEATURE_DIRECTORYINFO_ENUMERATEFILES (#1119)

* Remove FEATURE_DIRECTORYINFO_ENUMERATEFILES
* Add exception documentation
Wojciech Nagórski 2 years ago
parent
commit
072ba7e013

+ 0 - 32
src/Renci.SshNet/Abstractions/FileSystemAbstraction.cs

@@ -1,32 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-
-namespace Renci.SshNet.Abstractions
-{
-    internal class FileSystemAbstraction
-    {
-        /// <summary>
-        /// Returns an enumerable collection of file information that matches a search pattern.
-        /// </summary>
-        /// <param name="directoryInfo"></param>
-        /// <param name="searchPattern">The search string to match against the names of files.</param>
-        /// <returns>
-        /// An enumerable collection of files that matches <paramref name="searchPattern"/>.
-        /// </returns>
-        /// <exception cref="ArgumentNullException"><paramref name="directoryInfo"/> is <c>null</c>.</exception>
-        /// <exception cref="ArgumentNullException"><paramref name="searchPattern"/> is <c>null</c>.</exception>
-        /// <exception cref="DirectoryNotFoundException">The path represented by <paramref name="directoryInfo"/> does not exist or is not valid.</exception>
-        public static IEnumerable<FileInfo> 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
-        }
-    }
-}

+ 2 - 2
src/Renci.SshNet/Renci.SshNet.csproj

@@ -5,7 +5,7 @@
     <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
     <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
     <AssemblyName>Renci.SshNet</AssemblyName>
     <AssemblyName>Renci.SshNet</AssemblyName>
     <AssemblyOriginatorKeyFile>../Renci.SshNet.snk</AssemblyOriginatorKeyFile>
     <AssemblyOriginatorKeyFile>../Renci.SshNet.snk</AssemblyOriginatorKeyFile>
-    <LangVersion>6</LangVersion>
+    <LangVersion>7.3</LangVersion>
     <SignAssembly>true</SignAssembly>
     <SignAssembly>true</SignAssembly>
     <TargetFrameworks>net462;netstandard2.0;net6.0;net7.0</TargetFrameworks>
     <TargetFrameworks>net462;netstandard2.0;net6.0;net7.0</TargetFrameworks>
   </PropertyGroup>
   </PropertyGroup>
@@ -19,6 +19,6 @@
   </ItemGroup>
   </ItemGroup>
 
 
   <PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'net6.0' or '$(TargetFramework)' == 'net7.0' ">
   <PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'net6.0' or '$(TargetFramework)' == 'net7.0' ">
-    <DefineConstants>FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_SOCKET_TAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_EAP;FEATURE_DNS_SYNC;FEATURE_DNS_APM;FEATURE_DNS_TAP</DefineConstants>
+    <DefineConstants>FEATURE_SOCKET_TAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_EAP;FEATURE_DNS_SYNC;FEATURE_DNS_APM;FEATURE_DNS_TAP</DefineConstants>
   </PropertyGroup>
   </PropertyGroup>
 </Project>
 </Project>

+ 52 - 38
src/Renci.SshNet/SftpClient.cs

@@ -1996,6 +1996,7 @@ namespace Renci.SshNet
         /// <exception cref="ArgumentNullException"><paramref name="sourcePath"/> is <c>null</c>.</exception>
         /// <exception cref="ArgumentNullException"><paramref name="sourcePath"/> is <c>null</c>.</exception>
         /// <exception cref="ArgumentException"><paramref name="destinationPath"/> is <c>null</c> or contains only whitespace.</exception>
         /// <exception cref="ArgumentException"><paramref name="destinationPath"/> is <c>null</c> or contains only whitespace.</exception>
         /// <exception cref="SftpPathNotFoundException"><paramref name="destinationPath"/> was not found on the remote host.</exception>
         /// <exception cref="SftpPathNotFoundException"><paramref name="destinationPath"/> was not found on the remote host.</exception>
+        /// <exception cref="SshException">If a problem occurs while copying the file</exception>
         public IEnumerable<FileInfo> SynchronizeDirectories(string sourcePath, string destinationPath, string searchPattern)
         public IEnumerable<FileInfo> SynchronizeDirectories(string sourcePath, string destinationPath, string searchPattern)
         {
         {
             if (sourcePath == null)
             if (sourcePath == null)
@@ -2019,6 +2020,7 @@ namespace Renci.SshNet
         /// </returns>
         /// </returns>
         /// <exception cref="ArgumentNullException"><paramref name="sourcePath"/> is <c>null</c>.</exception>
         /// <exception cref="ArgumentNullException"><paramref name="sourcePath"/> is <c>null</c>.</exception>
         /// <exception cref="ArgumentException"><paramref name="destinationPath"/> is <c>null</c> or contains only whitespace.</exception>
         /// <exception cref="ArgumentException"><paramref name="destinationPath"/> is <c>null</c> or contains only whitespace.</exception>
+        /// <exception cref="SshException">If a problem occurs while copying the file</exception>
         public IAsyncResult BeginSynchronizeDirectories(string sourcePath, string destinationPath, string searchPattern, AsyncCallback asyncCallback, object state)
         public IAsyncResult BeginSynchronizeDirectories(string sourcePath, string destinationPath, string searchPattern, AsyncCallback asyncCallback, object state)
         {
         {
             if (sourcePath == null)
             if (sourcePath == null)
@@ -2074,60 +2076,72 @@ namespace Renci.SshNet
 
 
             var sourceDirectory = new DirectoryInfo(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<string, ISftpFile>();
-            foreach (var destFile in destFiles)
-            {
-                if (destFile.IsDirectory)
-                    continue;
-                destDict.Add(destFile.Name, destFile);
-            }
+                var destFiles = InternalListDirectory(destinationPath, null);
+                var destDict = new Dictionary<string, ISftpFile>();
+                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
             #endregion