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

本文关键字:zip filepart 命名为 重命名 SFTP 何确保 确保 WinSCP | 更新日期: 2023-09-27 18:36:08

使用 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);
    }
}

WinSCP 论坛上的讨论表明,程序集尚不允许以编程方式控制传输恢复支持。 有解决方法吗?

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

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

关闭恢复支持:

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

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

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

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

另请参阅错误消息"传输已成功完成,但临时传输文件...无法重命名为目标文件名..."

您所

要做的就是使用以下代码禁用TransferResumeSupport。

TransferOptions transferOptions = new TransferOptions();
transferOptions.ResumeSupport = new TransferResumeSupport {State = TransferResumeSupportState.Off };