WinSCP:如何确保SFTP上传从.zip.filepart重命名为.zip?

时间:2012-06-01 22:34:41

标签: c# sftp scp winscp winscp-net

使用WinSCP的.NET程序集上传文件。 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);
    }
}

Discussion over at the WinSCP forum表示程序集尚不允许以编程方式控制传输恢复支持。有解决方法吗?

3 个答案:

答案 0 :(得分:4)

听起来好像上传文件的目标服务器上的文件系统不允许文件更改权限。这可能导致在上载完成时重命名文件失败,尽管完整文件已上传并写入文件系统,并且传输正在进行时使用临时文件名。如果您没有对目标服务器的管理访问权限,则可以通过尝试重命名目标服务器上已有的文件来对其进行测试。如果这也失败了,那么您将需要在目标服务器上更改适当的权限才能使其正常工作。否则,您可能必须使用错误消息中提供的建议来关闭恢复支持,以便最初打开以使用所需的文件名而不是临时文件名(使用.filepart扩展名)进行写入。

答案 1 :(得分:1)

关闭恢复支持:

put *.txt -nopreservetime -nopermissions -resumesupport=off

答案 2 :(得分:0)

如果您包含完整的错误消息,包括服务器返回的根本原因,这将有所帮助。

我的猜测是服务器端运行的防病毒应用程序(或类似程序)。上载完成后,防病毒应用程序会检查任何文件。与上传完成后,WinSCP冲突尝试重命名文件。对于.ZIP档案,问题可能更频繁地发生,或者是因为它们往往更大或仅仅是因为它们需要在检查之前被提取(需要时间)。

无论如何,您可以使用TransferOptions.ResumeSupport禁用传输到临时文件名。

另请参阅error message "Transfer was successfully finished, but temporary transfer file ... could not be renamed to target file name ..."

的文档