【问题标题】:folders downloading as files in ftp文件夹在 ftp 中作为文件下载
【发布时间】:2013-07-05 15:09:13
【问题描述】:

因此,在我的 powershell 脚本启动时,它会轮询 ftp 服务器并下载任何不在本地文件夹中的文件。问题是当它到达一个文件夹时,它会将它们作为文件下载。这是我检查新文件的代码:

$LocFolder = 'C:\EMSDropBox\*'
Remove-Item $LocFolder
$ftprequest = [System.Net.FtpWebRequest]::Create("ftp://NZHQFTP1/tbarnes")
$ftprequest.Proxy = $null
$ftprequest.KeepAlive = $false
$ftprequest.TimeOut = 10000000
$ftprequest.UsePassive = $False
$ftprequest.Credentials = New-Object System.Net.NetworkCredential("tbarnes", "Static_flow2290") 
$ftprequest.Method = [System.Net.WebRequestMethods+Ftp]::ListDirectory

$FTPResponse = $ftprequest.GetResponse()
$ResponseStream = $FTPResponse.GetResponseStream()
$FTPReader = New-Object System.IO.Streamreader($ResponseStream)
$filename = $FTPReader.ReadLine()
while($filename -ne $null)
{
    try
    {
        if((Test-Path ("C:\emsdropbox\"+$filename)) -ne $true)
        {
            downloadFtp($filename)
        }
        $filename = $FTPReader.ReadLine()
    }
    catch
    {
        Write-Host $_
    }
}
$FTPReader.Close()
$FTPResponse.Close()
$ResponseStream.Close()

这是downloadFtp函数:

     # FTP Config
$FTPHost = "****"
$Username = "******"
$Password = "*********"
$FTPFile = $file

# FTP Log File Url
$FTPFileUrl = "ftp://" + $FTPHost + "/tbarnes/" + $FTPFile

    # Create FTP Connection
$FTPRequest = [System.Net.FtpWebRequest]::Create("$FTPFileUrl") 
$FTPRequest.Credentials = New-Object System.Net.NetworkCredential($Username, $Password) 
$FTPRequest.Method = [System.Net.WebRequestMethods+Ftp]::DownloadFile
$FTPRequest.UsePassive = $false
$FTPRequest.UseBinary = $true
$FTPRequest.KeepAlive = $false
$targetfile = New-Object IO.FileStream (("C:\emsdropbox\"+$file),[IO.FileMode]::Create)
# Get FTP File
$FTPResponse = $FTPRequest.GetResponse()
$ResponseStream = $FTPResponse.GetResponseStream()
$FTPReader = New-Object -typename System.IO.StreamReader -ArgumentList $ResponseStream
[byte[]]$readbuffer = New-Object byte[] 1024

#loop through the download stream and send the data to the target file
do{
    $readlength = $ResponseStream.Read($readbuffer,0,1024)
    $targetfile.Write($readbuffer,0,$readlength)
}
while ($readlength -ne 0)
$FTPReader.Close()

我不确定为什么它不会将它们作为文件夹拉下来,所以任何帮助或指针都会很棒!

【问题讨论】:

    标签: powershell ftp


    【解决方案1】:

    FTP 方法本身不支持下载文件夹或递归,所以除了我在下面提出的建议之外,我没有其他办法可以做到这一点。

    更改方法,以便您可以区分文件和目录并相应地处理它们。

    $ftprequest.Method = [System.Net.WebRequestMethods+Ftp]::ListDirectory 更改为$ftprequest.Method = [System.Net.WebRequestMethods+Ftp]::ListDirectoryDetails

    将以这种格式列出:

    -rwxrwxrwx   1 owner    group          277632 Mar  4 17:15 xml_socket.log.rar
    

    目录将以d 代替行首的-

    这是一个修改后的 try 块,它将仅匹配文件,因此您可以传递给 downloadFtp 函数:

        try
    {
        if(!($filename -match '^d')){if((Test-Path ("C:\emsdropbox\"+$filename.Split(" ")[8])) -ne $true)
        {
            downloadFtp(($filename -split '\s+')[8])
        }}
        $filename = $FTPReader.ReadLine()
    }
    

    如果您想随后获取目录列表,请针对同一 ftpresponse 流使用以下 try 块,并为每个 ListDirectoryDetails 获取每个目录中的文件列表以处理它们:

        try
    {
        if($filename -match '^d'){if((Test-Path ("C:\emsdropbox\"+$filename.Split(" ")[8])) -ne $true)
        {
            listdir(($filename -split '\s+')[8])
        }}
        $filename = $FTPReader.ReadLine()
    }
    

    您可能还需要创建本地目录,您可以在 powershell 中执行以下操作:

    New-Item c:\emsdropbox\newdir -type directory
    

    【讨论】:

    • 这是朝着正确方向迈出的一大步,谢谢!但是,当我将其更改为 ListDirectoryDe​​tails 时,我得到了一个问题:07-03-13 01:59PM 0 hmm.odd 前面没有文件属性
    • 这可能取决于 FTP 服务器软件/配置 - 不过很高兴您找到了解决方法 :-)
    猜你喜欢
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多