gpt4 book ai didi

powershell - 如何在与 PowerShell 断开连接后恢复 FTP 上传?

转载 作者:行者123 更新时间:2023-12-03 00:34:48 26 4
gpt4 key购买 nike

我有一个 PowerShell 脚本,我用它以 FTP 的形式从美国到欧洲传输一个 7.3 Gb 的文件。该脚本工作正常,直到偶尔出现连接断开和传输停止的情况。

我尝试了多个带有 try-catch 和重试计数器的版本,这样如果连接失败,它会重试发送相同的数据 block 。

这通常有效,但问题是当连接断开时,如果连接设法将一半的数据 block 发送到 FTP 位置然后连接失败,它会再次尝试发送整个数据 block ,所以当它完成时我可以结束发送一个更大的文件。

这个较大的文件也是一个损坏/无效的文件,因为它只是一个比它应该有的比特和字节更多的堆。

我用来通过 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()

现在,我不确定我该如何管理它。我一直在考虑将我的 block 大小从 256mb 缩小到 TCP 数据包的大小,但据我所知,这些大小也可能有所不同(最多 64Kb)。

因此,我正在寻找一种方法来以某种方式处理此连接中断,因为我目前不确定如何执行此操作。非常感谢任何帮助。

最佳答案

在使用 FtpWebRequest 中断连接后恢复传输的唯一方法是重新连接并开始写入文件末尾。

为此用途FtpWebRequest.ContentOffset .

上传完整代码的相关问题(尽管针对 C#):
How to download FTP files with automatic resume in case of disconnect


或者使用可以自动恢复传输的 FTP 库。

例如WinSCP .NET assembly做。有了它,可恢复的上传就变得微不足道了:

# 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
$session.PutFileToDirectory("C:\path\file.zip", "/home/user")

(我是 WinSCP 的作者)

关于powershell - 如何在与 PowerShell 断开连接后恢复 FTP 上传?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44776223/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com