gpt4 book ai didi

Powershell 分块读取文件

转载 作者:行者123 更新时间:2023-12-05 04:12:49 25 4
gpt4 key购买 nike

我有一个用 Powershell 编写的脚本,它通过 FTP 传输文件,使用以下命令运行良好:

$content = [System.IO.File]::ReadAllBytes($backup_app_data)

但是,一旦文件大小达到 2Gb,此方法就会停止工作,并抛出一条错误消息,指出此方法仅限于读取不超过此大小的文件。

Exception calling "ReadAllBytes" with "1" argument(s): "The file is too long. This operation is currently limited to supporting files less than 2 gigabytes in size.

现在,我正在尝试修改我的脚本并使用替代方法 Read ,据我所知,这将允许我分块读取文件,然后写入这些 block ,依此类推。

不幸的是,虽然我修改的脚本似乎可以正常工作,但由于在我的 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()

感谢任何帮助。

最佳答案

所以,根据评论区的建议,并以此为例the answer来自可能的重复 question ,我设法自己找到了解决方案。

下面是我用来通过 FTP 传输一个 3.74Gb 的 .zip 存档的代码。

$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 多次)尝试中完美运行。我希望它能帮助别人!

关于Powershell 分块读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39345335/

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