我正在用 C# 创建一个小型 .NET 应用程序,用于将文件上传到 FTP 服务器。在执行此操作时,我正在使用 WinSCP 的 .NET DLL,并且我一直在努力寻找解决问题的好方法。
我将放置所有文件的 FTP 文件夹将由另一个应用程序监控。然后,此应用程序将获取这些文件并自动处理它们。
所以我想避免的是我的文件在传输完成之前被应用程序抓取。
所以我想使用临时文件名或临时文件夹,然后在上传完成后移动文件。
您认为最好的方法是什么? 第二个问题是,在 WinSCP .NET 中应该有一个 Transfer Resume 选项,用于传输具有临时名称的文件并在完成后重命名。但我似乎无法让它发挥作用,并且正在寻找有关如何使其发挥作用的任何提示?
最佳答案
你是对的 "transfer to temporary file name" WinSCP 的功能看起来像是要走的路。
它使 WinSCP 上传文件时在其名称后附加 .filepart
,完成后删除扩展名。
TransferOptions transferOptions = new TransferOptions();
transferOptions.ResumeSupport.State = TransferResumeSupportState.On;
session.PutFiles(@"d:\toupload\myfile.dat", "/home/user/", false, transferOptions).Check();
虽然只有 SFTP 协议(protocol)支持它。
使用 FTP 协议(protocol),您必须手动执行此操作。
session.PutFiles(@"d:\toupload\myfile.dat", "/home/user/myfile.dat.filepart").Check();
session.MoveFile("/home/user/myfile.dat.filepart", "/home/user/myfile.dat");
如果您要上传多个文件,您可以使用 operation mask , 并迭代 Session.PutFiles
返回的成功上传文件列表在 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 file lock mechanism (也适用于 FTP)用于隐藏正在上传的文件的不同方法。
关于c# - 使用带有临时文件名的 WinSCP .NET/COM 上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27041606/