C# WinSCP:如何确保SFTP上载从.zip.filepart重命名为.zip?
使用WinSCP的.NET程序集上载文件C# WinSCP:如何确保SFTP上载从.zip.filepart重命名为.zip?,c#,sftp,scp,winscp,winscp-net,C#,Sftp,Scp,Winscp,Winscp Net,使用WinSCP的.NET程序集上载文件OperationResultBase.Check()抛出以下错误: WinSCP.SessionRemoteException:传输已成功完成,但无法将临时传输文件“testfile.zip.filepart”重命名为目标文件名“testfile.zip”。如果问题仍然存在,您可能需要关闭传输恢复支持 似乎我尝试发送的任何zip文件都会发生这种情况。如果有区别的话,这些是使用DotNetZip库创建的zip文件 我正在使用的代码,几乎直接取自WinSCP
OperationResultBase.Check()抛出以下错误:
WinSCP.SessionRemoteException:传输已成功完成,但无法将临时传输文件“testfile.zip.filepart”重命名为目标文件名“testfile.zip”。如果问题仍然存在,您可能需要关闭传输恢复支持
似乎我尝试发送的任何zip文件都会发生这种情况。如果有区别的话,这些是使用DotNetZip库创建的zip文件
我正在使用的代码,几乎直接取自WinSCP文档中的示例:
public void uploadFile(string filePath, string remotePath)
{
TransferOptions transferOptions = new TransferOptions();
transferOptions.TransferMode = TransferMode.Binary;
TransferOperationResult transferResult;
transferResult = currentSession.PutFiles(filePath, remotePath, false, transferOptions);
transferResult.Check();
foreach (TransferEventArgs transfer in transferResult.Transfers)
{
Console.WriteLine("Upload of {0} succeeded", transfer.FileName);
}
}
指示程序集尚不允许对传输恢复支持进行编程控制。是否有解决方法?听起来好像文件上载到的目标服务器上的文件系统不允许文件更改权限。这可能会导致在上载完成时重命名文件失败,尽管在传输过程中已使用临时文件名上载完整文件并将其写入文件系统。如果您没有对目标服务器的管理访问权限,可以通过尝试重命名目标服务器上已有的文件来测试这一点。如果这也失败了,那么您需要更改目标服务器上的适当权限才能使其正常工作。否则,您可能必须使用错误消息中提供的建议来关闭恢复支持,以便最初使用所需的文件名而不是临时文件名(扩展名为.filepart)打开它进行写入。如果您包含完整的错误消息,包括服务器返回的根本原因,则会有所帮助
我猜服务器端正在运行一个防病毒应用程序(或类似程序)。一旦上传完成,防病毒应用程序将检查任何文件。这与WinSCP尝试在上载完成后重命名文件相冲突。对于.ZIP归档文件,问题可能会更频繁地出现,这可能是因为它们往往更大,也可能仅仅是因为它们需要在检查之前提取(这需要时间)
无论如何,您可以使用禁用传输到临时文件名
另请参阅有关关闭简历支持的文档:
put *.txt -nopreservetime -nopermissions -resumesupport=off
我觉得奇怪的是,上传使用的文件名与实际需要的文件名不同。您可以控制吗?@sarnold,来自WinSCP文档:“使用SFTP协议传输文件时,首先将其传输到扩展名为.filepart的临时文件中。只有在传输完成后,扩展名才会被删除。”如果您可以访问服务器,是否可以从SysInternals运行类似processmonitor的东西,以查看文件上载完成时发生了什么。例如,一个防病毒程序可能会在文件关闭时开始扫描该文件,并且在尝试重命名时仍在访问该文件。@sgmoore,很遗憾,我没有服务器访问权限。赏金文本中有一个输入错误。它应该是WinSCP的.NET汇编,而不是C#的.NET汇编--来自西格尔。对不起,伙计,如果不删除它,就无法编辑它。@sarnold-你是对的,我在回复中一直引用FTP而不是SCP。我在打字时通过FTP下载了一些日志文件,因此出现了命名错误。我可以使用WinSCP的GUI会话手动更改文件名。正如我在问题末尾所指出的,.NET程序集没有控制传输恢复支持的功能。WinSCP是开源的,所以我可以为我想要的函数编写一个C#包装器,但我希望有一个更快的解决方案。另一个简要说明:我有权更改目标服务器上的文件名。此外,当我使用GUI进行上传时,上传过程运行良好;只有当我试图通过.NET来实现它时,它才会失败。