Rad*_*hiu 1 ftp powershell ftpwebrequest
我有一个PowerShell脚本,我正在使用它来传输从美国到欧洲的7.3 Gb文件.脚本工作正常,直到偶尔连接断开和传输停止.
我已尝试使用try-catch和重试计数器的多个版本,以便在连接失败时重试发送相同的块.
这通常有效,但问题是当连接断开时,如果连接设法将一半块发送到FTP位置然后连接失败,它会再次尝试发送整个块,所以当它完成时我最终会得到一个发送的文件较大.
这个较大的文件也是一个损坏/无效的文件,因为它只是一个比它应该拥有更多位和字节的堆.
我用来FTP文件的代码是:
# FTP connection details
$ftp_addr = "ftp://ftp.example.com/Backups/"
$user = "abc"
$pass = "1234"
$bufSize = 256mb
# some more irrelevant code here where I identify files to be FTP'ed etc.
# ......
# Initialize connection to FTP
$ftp = [System.Net.FtpWebRequest]::Create($destination_filename+".zip")
$ftp = [System.Net.FtpWebRequest]$ftp
$ftp.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
$ftp.Credentials = new-object System.Net.NetworkCredential($user, $pass)
$ftp.Timeout = -1 #infinite timeout
$ftp.ReadWriteTimeout = -1 #infinite timeout
$ftp.UseBinary = $true
$ftp.UsePassive = $true
$requestStream = $ftp.GetRequestStream()
$fileStream = [System.IO.File]::OpenRead($backup_target_app_data)
$chunk = New-Object byte[] $bufSize
try {
while( $bytesRead = $fileStream.Read($chunk,0,$bufsize) )
{
$retryCount = 0
while ($retryCount -ne 30) {
try {
$requestStream.write($chunk, 0, $bytesRead)
$requestStream.Flush()
}
catch {
$retryCount += 0
}
}
}
$FileStream.Close()
$requestStream.Close()
Run Code Online (Sandbox Code Playgroud)
现在,我不知道如何管理这个.我一直在考虑将我的块大小从256mb缩小到TCP数据包的大小,但据我所知,这些也可以变化(高达64Kb).
所以,我正在寻找一种方法以某种方式处理这种连接丢失,因为我现在不确定如何做到这一点.任何帮助都非常感谢.
在连接中断后恢复传输的唯一方法FtpWebRequest是重新连接并开始写入文件的末尾.
为此用途FtpWebRequest.ContentOffset.
或者使用可以自动恢复传输的FTP库.
例如WinSCP .NET程序集.有了它,可恢复的上传就像以下一样简单:
# Load WinSCP .NET assembly
Add-Type -Path "WinSCPnet.dll"
# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
Protocol = [WinSCP.Protocol]::Ftp
HostName = "ftp.example.com"
UserName = "user"
Password = "mypassword"
}
$session = New-Object WinSCP.Session
# Connect
$session.Open($sessionOptions)
# Resumable upload
$transferResult = $session.PutFiles("C:\path\file.zip", "/home/user/file.zip").Check()
Run Code Online (Sandbox Code Playgroud)
(我是WinSCP的作者)
| 归档时间: |
|
| 查看次数: |
705 次 |
| 最近记录: |