使用带有临时文件名的WinSCP .NET/COM上传文件

Art*_*gas 5 c# ftp temporary-files winscp-net

我在C#中创建一个小型.NET应用程序,将文件上传到FTP服务器.我正在使用.NET DLL for WinSCP,我一直试图找到一个很好的解决方案来解决我的问题.

我将放置所有文件的FTP文件夹将由另一个应用程序监视.然后,此应用程序将采用这些文件并自动处理它们.

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

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

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

Mar*_*ryl 4

你是对的, WinSCP 的“传输到临时文件名”功能看起来是正确的选择。

它使 WinSCP 上传文件,并.filepart在其名称后附加 后缀,完成后删除扩展名。

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

尽管仅支持 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");
Run Code Online (Sandbox Code Playgroud)

如果要上传多个文件,则可以使用操作 maskSession.PutFiles ,并迭代in返回的成功上传文件列表TransferOperationResult,调用Session.MoveFileforeach.

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);
}
Run Code Online (Sandbox Code Playgroud)

上传时锁定文件/上传到临时文件名一文中还有一个完整的 PowerShell 示例。


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