WinSCP从Windows传文件至Linux报错:TimeSpan溢出(时长过长)
解决WinSCP上传文件时的TimeSpan溢出问题
我一眼就看出问题出在你设置的Timeout = TimeSpan.MaxValue上!WinSCP内部处理超时逻辑时,会对这个时间值做累加操作,而TimeSpan.MaxValue已经是时间跨度的上限,再加上任何正数都会直接触发溢出,这就是你遇到Timespan overflowed because the duration is too long错误的根源。
修复方案
你只需要把超时时间改成一个合理的大值就能解决问题,比如根据上传需求设置成24小时或几个小时,既不会因超时太短中断正常传输,也不会触发溢出异常:
修改你的SessionOptions部分代码:
SessionOptions sessionOptions = new SessionOptions { Protocol = Protocol.Ftp, HostName = HostName, UserName = UserName, Password = Password, Timeout = TimeSpan.FromHours(24), // 替换成符合你需求的超时时间,比如2小时就写FromHours(2) };
如果你的文件特别大,还可以给传输操作单独设置超时(可选):
TransferOptions transferOptions = new TransferOptions(); transferOptions.TransferMode = TransferMode.Ascii; transferOptions.Timeout = TimeSpan.FromHours(12); // 针对文件传输的单独超时设置
错误原因详解
WinSCP的Session类在后台会持续检查是否超过设置的超时时间,它的逻辑是不断累加已消耗的时间来和超时阈值对比。当你设置了TimeSpan.MaxValue,哪怕只加一点点时间,都会超出TimeSpan类型能存储的最大范围,直接抛出溢出异常。所以永远不要用TimeSpan.MaxValue作为WinSCP的超时设置,选一个实际够用的最大值就好。
另外也可以顺便检查下网络连接是否稳定,如果传输频繁中断,也可能间接触发超时逻辑异常,但当前最核心的问题肯定是超时时间的设置错误。
内容的提问来源于stack exchange,提问作者venkat14
相关产品推荐
相关产品推荐

