在 PowerShell 脚本中,我可以延迟读取 FTP ListDirectoryDetails 流多长时间?
In PowerShell script how short can I delay reading an FTP ListDirectoryDetails stream?
背景:通过不同的技术在 PowerShell 中通过 FTP 检索远程目录信息。
下面的脚本似乎是使用 PowerShell 中可用的 'off-the-shelf' FTP ListDirectoryDetails 检索远程目录详细信息的一种流行方式。 (link1, link2, link3) 效果很好。
$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,提高了 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()
如果您需要逐行阅读响应,代码仍然可以比您的问题简单得多。我已经在我对您之前问题的回答中向您发布了这样的代码
背景:通过不同的技术在 PowerShell 中通过 FTP 检索远程目录信息。
下面的脚本似乎是使用 PowerShell 中可用的 'off-the-shelf' FTP ListDirectoryDetails 检索远程目录详细信息的一种流行方式。 (link1, link2, link3) 效果很好。
$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,提高了 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()
如果您需要逐行阅读响应,代码仍然可以比您的问题简单得多。我已经在我对您之前问题的回答中向您发布了这样的代码