使用 WinSCP .NET 程序集比较本地和远程文件
Posted
技术标签:
【中文标题】使用 WinSCP .NET 程序集比较本地和远程文件【英文标题】:Compare local and remote files using WinSCP .NET assembly 【发布时间】:2021-12-29 10:06:10 【问题描述】:我正在尝试实现一些逻辑来比较远程服务器和本地服务器之间的文件信息。
我需要比较本地文件夹和远程文件夹之间的文件名并只下载新文件。
我尝试在列表中使用加载文件并使用Except
函数,但它不起作用。
感谢您的帮助。
请找出我尝试过的场景之一。
using (Session session = new Session())
// Connect
session.Open(sessionOptions);
const string remotePath = "/Test";
const string localPath = @"C:\Local";
const string ArchivePath = @"C:\Users\Local\Archive";
System.IO.DirectoryInfo dir2 = new System.IO.DirectoryInfo(ArchivePath);
RemoteDirectoryInfo dir1 = session.ListDirectory(remotePath);
IEnumerable<System.IO.FileInfo> list2 =
dir2.GetFiles("*.*", System.IO.SearchOption.AllDirectories);
IEnumerable<RemoteFileInfo> list1 =
session.EnumerateRemoteFiles(remotePath, "*.csv", EnumerationOptions.None);
var firstNotSecond = list1.Except(list2).ToList();
得到类似的错误
“IEnumerable”不包含“Except”的定义,最佳扩展方法重载“Queryable.Except(IQueryable, IEnumerable)”需要“IQueryable”类型的接收器
【问题讨论】:
【参考方案1】:您只需要比较文件名:
var firstNotSecond =
list1.Select(_ => _.Name).Except(list2.Select(_ => _.Name)).ToList();
请注意,WinSCP .NET 已内置此功能。有Session.CompareDirectories
。
如果您真的想同步目录,可以使用Session.SynchronizeDirectories
。一种可以为您做所有事情的方法。
session.SynchronizeDirectories(
SynchronizationMode.Local, localPath, remotePath, false).Check()
【讨论】:
以上是关于使用 WinSCP .NET 程序集比较本地和远程文件的主要内容,如果未能解决你的问题,请参考以下文章
WinSCP .NET 程序集无法识别 Session.PutFiles 中的 FTP 链接/URL
使用 PowerShell 脚本中的 WinSCP .NET 程序集在 Linux 服务器上运行 bash 脚本
SSH 主机密钥指纹...与模式不匹配...在 C# 中使用 WinSCP .NET 程序集下载文件时
如何使用密码或 SSH 指纹进行 SFTP 身份验证 WinSCP C# .NET 程序集
WinSCP .NET 程序集失败,在 C# Azure 函数中的 Session.Open 中出现“未找到 winscp.exe 可执行文件”