5

我正在用 C# 创建一个小型 .NET 应用程序来将文件上传到 FTP 服务器。在执行此操作时,我正在为 WinSCP 使用 .NET DLL,并且我一直在尝试找到解决问题的好方法。

我将放置所有文件的 FTP 文件夹将被另一个应用程序监控。然后,此应用程序将获取这些文件并自动处理它们。

所以我要避免的是我的文件在传输完成之前被应用程序抓取。

所以我想使用临时文件名或临时文件夹,然后在上传完成后移动文件。

您认为最好的方法是什么?第二个问题是,在 WinSCP .NET 中应该有一个 Transfer Resume 选项,它可以使用临时名称传输文件并在完成时重命名。但我似乎无法让它发挥作用,并且正在寻找关于如何让它发挥作用的任何提示?

4

1 回答 1

4

你是对的,WinSCP 的“传输到临时文件名”功能看起来像是要走的路。

它使 WinSCP 上传文件并.filepart附加其名称,完成后剥离扩展名。

TransferOptions transferOptions = new TransferOptions();
transferOptions.ResumeSupport.State = TransferResumeSupportState.On;
session.PutFiles(@"d:\toupload\myfile.dat", "/home/user/", false, transferOptions).Check();

尽管仅 SFTP 协议支持它。


使用 FTP 协议,您必须手动执行此操作。

session.PutFiles(@"d:\toupload\myfile.dat", "/home/user/myfile.dat.filepart").Check();
session.MoveFile("/home/user/myfile.dat.filepart", "/home/user/myfile.dat");

如果要上传多个文件,可以使用操作掩码,并迭代Session.PutFilesin返回的成功上传文件列表,为每个文件TransferOperationResult调用Session.MoveFile

TransferOperationResult transferResult;
transferResult = session.PutFiles(@"d:\toupload\*.dat", "/home/user/*.filepart")

// Throw on any error
transferResult.Check();

// Rename uploaded files
foreach (TransferEventArgs transfer in transferResult.Transfers)
{
    string finalName = transfer.Destination.Replace(".filepart", ".dat");
    session.MoveFile(transfer.Destination, finalName);
}

在Locking files while uploading / Upload to temporary file name一文中还有一个完整的 PowerShell 示例。


另请参阅SFTP 文件锁定机制(也适用于 FTP),了解隐藏上传文件的不同方法。

于 2014-11-20T14:49:34.587 回答