【问题标题】:WinSCP: How to make sure SFTP upload gets renamed from .zip.filepart to .zip?WinSCP:如何确保 SFTP 上传从 .zip.filepart 重命名为 .zip?
【发布时间】:2012-06-01 22:34:41
【问题描述】:

使用 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 表示程序集还不允许对传输恢复支持进行编程控制。有解决办法吗?

【问题讨论】:

  • 上传使用的文件名与实际所需的文件名不同,这对我来说似乎很奇怪。你有控制权吗?
  • @sarnold,来自 WinSCP 文档:“使用 SFTP 协议传输文件时,首先将其传输到具有 .filepart 扩展名的临时文件中。只有在传输完成后,才会删除扩展名。”
  • 如果您可以访问服务器,是否可以从 SysInternals 运行进程监视器之类的东西,以查看文件上传完成时会发生什么。例如,防病毒程序可能会在文件关闭时开始扫描文件,并在尝试重命名时仍在访问文件。
  • @sgmoore,很遗憾我没有服务器访问权限。
  • 赏金文本中有错字。而不是“C#的.NET程序集”,它应该说“WinSCP的.NET程序集”。 ——来自印记。抱歉,如果不删除它就无法编辑它。

标签: c# sftp scp winscp winscp-net


【解决方案1】:

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

【讨论】:

  • @sarnold - 你是对的,我在回复中一直提到 FTP 而不是 SCP。我在打字时通过 FTP 下载了一些日志文件,因此出现了命名错误。将修复,因为响应符合预期。
  • 我可以使用 WinSCP 的 GUI 会话手动更改文件名。正如我在问题末尾指出的那样,.NET 程序集没有控制传输恢复支持的功能。 WinSCP 是开源的,所以我可以为我想要的函数编写一个 C# 包装器,但我希望有一个更快的解决方案。
  • 对此的另一个快速说明:我有权更改目标服务器上的文件名。此外,当我使用 GUI 进行上传时,上传过程也可以正常工作;只有当我尝试通过 .NET 进行操作时才会失败。
【解决方案2】:

关闭简历支持:

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-19
      相关资源
      最近更新 更多