Skip to content

Commit

Permalink
Remove FEATURE_DIRECTORYINFO_ENUMERATEFILES (#1119)
Browse files Browse the repository at this point in the history
* Remove FEATURE_DIRECTORYINFO_ENUMERATEFILES
* Add exception documentation
  • Loading branch information
WojciechNagorski authored May 22, 2023
1 parent 8c932fb commit 072ba7e
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 72 deletions.
32 changes: 0 additions & 32 deletions src/Renci.SshNet/Abstractions/FileSystemAbstraction.cs

This file was deleted.

4 changes: 2 additions & 2 deletions src/Renci.SshNet/Renci.SshNet.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<AssemblyName>Renci.SshNet</AssemblyName>
<AssemblyOriginatorKeyFile>../Renci.SshNet.snk</AssemblyOriginatorKeyFile>
<LangVersion>6</LangVersion>
<LangVersion>7.3</LangVersion>
<SignAssembly>true</SignAssembly>
<TargetFrameworks>net462;netstandard2.0;net6.0;net7.0</TargetFrameworks>
</PropertyGroup>
Expand All @@ -19,6 +19,6 @@
</ItemGroup>

<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>
</Project>
90 changes: 52 additions & 38 deletions src/Renci.SshNet/SftpClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1996,6 +1996,7 @@ public void SetAttributes(string path, SftpFileAttributes fileAttributes)
/// <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="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)
{
if (sourcePath == null)
Expand All @@ -2019,6 +2020,7 @@ public IEnumerable<FileInfo> SynchronizeDirectories(string sourcePath, string de
/// </returns>
/// <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="SshException">If a problem occurs while copying the file</exception>
public IAsyncResult BeginSynchronizeDirectories(string sourcePath, string destinationPath, string searchPattern, AsyncCallback asyncCallback, object state)
{
if (sourcePath == null)
Expand Down Expand Up @@ -2074,60 +2076,72 @@ private IEnumerable<FileInfo> 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<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
Expand Down

0 comments on commit 072ba7e

Please sign in to comment.