Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在与PowerShell的连接中断后恢复FTP上载?_Powershell_Ftp_Ftpwebrequest - Fatal编程技术网

如何在与PowerShell的连接中断后恢复FTP上载?

如何在与PowerShell的连接中断后恢复FTP上载?,powershell,ftp,ftpwebrequest,Powershell,Ftp,Ftpwebrequest,我有一个PowerShell脚本,我正在使用它将一个7.3 Gb的文件以块的形式从美国FTP到欧洲。脚本工作正常,直到偶尔连接断开,传输停止 我使用try-catch和重试计数器尝试了多个版本,因此如果连接失败,它会重试发送相同的块 这通常是可行的,但问题是当连接断开时,如果连接成功地将一半的数据块发送到FTP位置,然后连接失败,它会重试再次发送整个数据块,这样当连接完成时,我可以发送一个更大的文件 这个较大的文件也是一个已损坏/无效的文件,因为它只是一个包含比预期更多位和字节的堆 我用来FTP

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

我使用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()
现在,我不知道我该怎么办。我一直在考虑将数据块大小从256mb缩小到TCP数据包的大小,但据我所知,这些数据块大小也可能有所不同(高达64Kb)


所以,我正在寻找一种方法来处理这种连接中断,因为我现在不知道该怎么做。非常感谢您的帮助。

连接被中断后,恢复传输的唯一方法是重新连接并开始写入文件末尾

为了这个目的

上传完整代码的相关问题(尽管是C#)):


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

举个例子来说。有了它,可恢复的上传就变得非常简单:

# 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的作者)