我有一个用Powershell编写的脚本,它通过FTP传输文件,使用以下方法正常工作:
$content = [System.IO.File]::ReadAllBytes($backup_app_data)
但是一旦文件大小达到2Gb,这就停止了工作,方法是抛出一个错误,说这个方法仅限于读取这个大小的文件。
使用“1”参数调用“ReadAllBytes”的异常:“文件是 太长。此操作目前仅限于支持较少的文件 超过2千兆字节。
现在,我正在尝试修改我的脚本并使用Read的替代方法,根据我的理解,这将允许我以块的形式读取文件,然后编写这些块等等。
不幸的是,虽然我修改的脚本似乎正在工作,但由于在我的FTP位置创建了一个文件,因此没有数据被传输,并且脚本不会抛出任何错误。
目标文件夹中只创建了一个0kb文件,脚本结束。
我试过做一些调试,但我似乎无法找到问题。以下是我目前正在使用的代码。
$file = 'G:\Backups\DATA_backup_2016_09_05.zip'
$dest_name = 'DATA_backup_2016_09_05.zip'
$ftp = [System.Net.FtpWebRequest]::Create($ftp+$dest_name)
$ftp = [System.Net.FtpWebRequest]$ftp
$ftp.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
$ftp.Credentials = new-object System.Net.NetworkCredential($user, $pass)
$ftp.UseBinary = $true
$ftp.UsePassive = $true
# determine the size of the file
$file_size = (Get-Item $file).length
$chunk_size = 512mb
$bytes_to_read = $file_size
$iterations = $file_size / $chunk_size
$iter = 0
$fstream = [System.IO.FileStream]
[byte[]] $byte_array
while ($bytes_to_read > 0){
if($iterations > 1) {
$content = $fstream.Read($byte_array, $iter, $chunk_size)
}
else {
$content = $fstream.Read($byte_array, $iter, $bytes_to_read)
}
$ftp.ContentLength = $content.Length
$rs = $ftp.GetRequestStream()
$rs.Write($content, 0, $content.Length)
# keep the loop going
$iter = $iter + 1
$iterations = $iterations - 1
$bytes_to_read = $bytes_to_read - $chunk_size
}
$rs.Close()
$rs.Dispose()
感谢任何帮助。
答案 0 :(得分:1)
因此,根据评论部分中的建议并使用可能的重复the answer中的question作为示例,我自己找到了解决方案。
下面是我用来通过FTP传输.zip存档的代码,该存档是3.74Gb。
$ftp_addr = "ftp://ftp.somerandomwebsite.com/folder1/"
$user = "usr"
$pass = "passwrd"
$bufSize = 256mb
# ... missing code where I identify the file I want to FTP ... #
# Initialize connection to FTP
$ftp = [System.Net.FtpWebRequest]::Create($ftp_addr + $backup_file + ".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($file_to_ftp)
$chunk = New-Object byte[] $bufSize
while ( $bytesRead = $fileStream.Read($chunk, 0, $bufsize) ){
$requestStream.write($chunk, 0, $bytesRead)
$requestStream.Flush()
}
$FileStream.Close()
$requestStream.Close()
到目前为止,这段代码在多次(20次以上)尝试中运行良好。我希望它可以帮助别人!