在PowerShell脚本中,读取FTP ListDirectoryDetails流可以延迟多长时间?
背景:通过不同的技术在PowerShell中通过FTP检索远程目录信息 下面的脚本似乎是使用PowerShell中提供的“现成”FTP ListDirectoryDetails检索远程目录详细信息的常用方法。(,)而且效果很好在PowerShell脚本中,读取FTP ListDirectoryDetails流可以延迟多长时间?,powershell,ftp,ftpwebrequest,Powershell,Ftp,Ftpwebrequest,背景:通过不同的技术在PowerShell中通过FTP检索远程目录信息 下面的脚本似乎是使用PowerShell中提供的“现成”FTP ListDirectoryDetails检索远程目录详细信息的常用方法。(,)而且效果很好 $server = "ftp://servername" $ftp = [system.net.ftpwebrequest] [system.net.webrequest]::create($server) $ftp.method = [system.net.WebReq
$server = "ftp://servername"
$ftp = [system.net.ftpwebrequest] [system.net.webrequest]::create($server)
$ftp.method = [system.net.WebRequestMethods+ftp]::listdirectorydetails
$response = $ftp.getresponse()
$stream = $response.getresponsestream()
$buffer = new-object System.Byte[] 1024
$encoding = new-object System.Text.AsciiEncoding
$outputBuffer = ""
$foundMore = $false
## Read all the data available from the stream, writing it to the
## output buffer when done.
do
{
## Allow data to buffer for a bit
start-sleep -m 1000
## Read what data is available
$foundmore = $false
$stream.ReadTimeout = 1000
do
{
try
{
$read = $stream.Read($buffer, 0, 1024)
if($read -gt 0)
{
$foundmore = $true
$outputBuffer += ($encoding.GetString($buffer, 0, $read))
}
} catch { $foundMore = $false; $read = 0 }
} while($read -gt 0)
} while($foundmore)
$outputBuffer
当do循环开始时,设置一个延迟。检索多个文件夹时,延迟将乘以文件夹数。因此,延迟越短,下载速度就越快。我把它降到了100,提高了10倍,效果很好。但我不是这些事情的大师,我并不真正理解延迟的必要性,也不理解延迟不足的后果
有人能解释一下我们正在处理的机制吗?您不需要任何延迟。这没有任何意义
事实上,恰恰相反。如果有延迟,服务器可能会关闭连接,因为读取响应的时间可能太长
这段代码的功能极其复杂
这将起到同样的作用:
$url = "ftp://username:password@ftp.example.com/remote/path/"
$request = [Net.WebRequest]::Create($url)
$request.Method = [System.Net.WebRequestMethods+Ftp]::ListDirectoryDetails
$response = $request.GetResponse()
$reader = New-Object System.IO.StreamReader($response.GetResponseStream())
$outputBuffer = $reader.ReadToEnd()
如果您需要逐行阅读回复,代码仍然可以比您的问题简单得多。我在回答你之前的问题时已经向你发布了这样的代码哇,我没有意识到在之前的帖子中发生了什么,应该仔细研究一下;这就是我们有时走的路;谢谢你指出这一点。正如我对我们之前的一次交流所作的评论,我正在一步一步地完成这项工作,以确保我完全理解正在发生的事情。我完全希望最终能在WinSCP工作,但我会一步一步地做到。还将更仔细地查看上面的文章和其他文章,并重做ListDirectoryDetails的脚本测试。感谢您确认上述代码中的延迟没有意义。请继续。我终于能够使用上面的示例和您提到的其他链接编写一个完整的脚本。你帮了大忙-谢谢。现在我看到ListDirectoryDetails完全正常工作,我想问一下WinSCPnet.dll
是PowerShell脚本还是其他编译模块。它检索目录数据的速度是否明显快于ListDirectoryDetails?@AlanWinSCPnet.dll
是运行winscp.exe
脚本接口的C程序集。请看-不,我不认为WinSCP会明显快于FtpWebRequest
,因为两者在引擎盖下的速度相同。