WinSCP .NET SynchronizeDirectories 在从远程文件夹中删除本地文件后不会删除它们

WinSCP .NET SynchronizeDirectories is not deleting local files after they've been removed from the remote folder

我正在尝试使用 WinSCP .NET 库将文件从远程位置同步到本地路径,以便将源文件夹中的新文件或更新文件下载到目标位置,并将文件目标中已从源文件夹中删除的内容将从目标中删除。

同步调用的计算结果如下:

var fileMask = "/FTP_root/Folder_*/*.png>2016-01-01 00:00:00";
var results = session.SynchronizeDirectories(SynchronizationMode.Local,
                                             @"C:\ProjectFolder\AppData",
                                             FTPDirectory,
                                             true,
                                             false,
                                             SynchronizationCriteria.Time,
                                             new TransferOptions() { FileMask = fileMask });

回顾一下,SynchronizeDirectories 的参数是:

SynchronizationMode
LocalPath
RemotePath
RemoveFiles
Mirror
SynchronizationCriteria
TransferOptions

我在这段代码中发现的是,新文件和重命名的文件会按预期下载,但是从远程文件夹中删除的文件不会被删除,对于重命名的文件,旧文件和重命名文件都不会被删除。同步后新文件名在本地文件夹中

同步将文件掩码应用于远程和本地路径,以便在两个方向上识别哪些文件适用于同步。

File Mask 文档 (https://winscp.net/eng/docs/file_mask) 的相关部分是:

  • "For a partial path mask it makes no difference whether you use back () or forward slashes (/); the mask will always work for both local and remote paths"

  • "You can also specify full path to a specific file or directory, both local and remote"

  • "The full path mask matches a local or a remote paths only, depending on syntax used"

在这种情况下,似乎使用完整路径掩码导致掩码仅应用于远程路径。对于支持新文件、重命名和删除的同步,路径掩码应该通过使用相对路径在远程和本地匹配,例如

var fileMask = "*/Folder_*/*.png";

或者除了远程匹配之外,还包括一个匹配本地的掩码:

var fileMask = @"C:\ProjectFolder\AppData\Folder_*\*.png; /FTP_root/Folder_*/*.png;

我只是简单地测试了后一种方法,但它似乎也有效(尽管需要考虑掩码中的大小和时间限制)。相对路径方法适用于我的情况,尽管它并不完全等同于完整路径方法(因为它也可能匹配目录层次结构中较低的文件夹)。