使用 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 可执行文件”

不要使用 WinSCP 将整个本地文件夹传输到远程目录,而只传输其中的文件