在PowerShell脚本中,我可以延迟读取FTP ListDirectoryDe​​tails流吗?

时间:2017-12-01 16:22:07

标签: powershell ftp ftpwebrequest

后台:使用不同的技术在PowerShell中通过FTP检索远程目录信息。

下面的脚本似乎是使用PowerShell中提供的“现成的”FTP ListDirectoryDe​​tails检索远程目录详细信息的常用方法。 (link1link2link3),效果很好。

$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 loop开始时,设置延迟。检索多个文件夹时,延迟将乘以文件夹数。因此延迟越短,下载速度越快。我把它降到100,改进了十倍,它运行良好。但是,在这些事情上,我并不是一个大师,我并不真正理解延迟的必要性,也不了解延迟不足的后果。

有人可以解释我们在这里处理的机制吗?

1 个答案:

答案 0 :(得分:1)

您不需要任何延迟。这没有任何意义。

实际上恰恰相反。如果延迟,服务器可能会关闭连接,因为读取响应可能需要很长时间。

而且该代码的功能非常复杂。

这将做同样的事情:

$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()

如果您需要逐行阅读响应,代码仍然比您的问题简单得多。我已经在您对上一个问题Can PowerShell use FTP to retrieve remote folder and subfolder directory data in a single transmission?

的回答中将这些代码发布给您了