我在C#中创建一个小型.NET应用程序,将文件上传到FTP服务器。我正在使用.NET DLL for WinSCP,我一直试图找到一个很好的解决方案来解决我的问题。
我将放置所有文件的FTP文件夹将被另一个应用程序监视。然后,此应用程序将采用这些文件并自动处理它们。
所以我想避免的是在传输完成之前我的文件被应用程序抓取。
所以我想使用临时文件名用法或临时文件夹,然后在上传完成后移动文件。
您认为最佳方法是什么? 第二个问题是,在WinSCP .NET中,应该有一个Transfer Resume选项,它使用临时名称传输文件,并在完成时重命名。但我似乎无法让这个工作,并正在寻找任何关于如何使这个工作的提示?
答案 0 :(得分:4)
你是对的,WinSCP的"transfer to temporary file name"功能看起来就像是要走的路。
它使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");
如果您要上传多个文件,可以使用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),了解隐藏上传文件的不同方法。