C# 和 Powershell,从 FTP 下载文件

C# and Powershell, Download File From FTP

我想下载 ftp 服务器上文件夹的内容。 我用这个 Powershell 脚本做到了:

#FTP Server Information - SET VARIABLES
    $ftp = "ftp://my.server.ftp" 
    $user = 'ftp_user' 
    $pass = 'password'
    $folder = '\folder\folder1\'
    $target = "C:\temp\"

    #SET CREDENTIALS
    $credentials = new-object System.Net.NetworkCredential($user, $pass)

    function Get-FtpDir ($url,$credentials) {
        $request = [Net.WebRequest]::Create($url)
        $request.Method = [System.Net.WebRequestMethods+FTP]::ListDirectory
        if ($credentials) { $request.Credentials = $credentials }
        $response = $request.GetResponse()
        $reader = New-Object IO.StreamReader $response.GetResponseStream() 
        $reader.ReadToEnd()
        $reader.Close()
        $response.Close()
    }

    #SET FOLDER PATH
    $folderPath= $ftp + "/" + $folder + "/"

    $Allfiles=Get-FTPDir -url $folderPath -credentials $credentials
    $files = ($Allfiles -split "`r`n")

    $files 

    $webclient = New-Object System.Net.WebClient 
    $webclient.Credentials = New-Object System.Net.NetworkCredential($user,$pass) 
    $counter = 0
    foreach ($file in ($files | where {$_ -like "*.*"})){
        $source=$folderPath + $file  
        $destination = $target + $file 
        $webclient.DownloadFile($source, $target+$file)

        #PRINT FILE NAME AND COUNTER
        $counter++
        $counter
        $source
    }
}

但现在我正在尝试将此 powershell 脚本插入到 C# 应用程序中。 我已经走到这一步了:

static void Main(string[] args)
        {                       
            string ftp = "ftp://my.server.ftp";
            string user = "ftp_user";
            string pass = "password";
            string folder = "\folder\folder1\";
            string target = "C:\temp\";

            NetworkCredential credentials = new NetworkCredential(user, pass);

            string folderPath = ftp + "/" + folder + "/";

            var AllFiles = GetDir(folderPath, credentials);
            ??? $files = ($Allfiles -split "`r`n") ???
        }

        public static Object GetDir(string url, NetworkCredential credentials)
        {
            WebRequest request = WebRequest.Create(url);
            request.Method = WebRequestMethods.Ftp.ListDirectory;
            request.Credentials = credentials;
            WebResponse response = request.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream());
            reader.ReadToEnd();
            reader.Close();
            response.Close();           
        } 

在 powershell 脚本中 "Get-FtpDir" 函数我不知道它是什么对象 returns 因此我不知道如何翻译这两个语句:

$Allfiles=Get-FTPDir -url $folderPath -credentials $credentials
$files = ($Allfiles -split "`r`n")

有人可以帮助我吗?

提前致谢

为什么要在 C# 应用程序中使用 Powershell 脚本?

这里是 link 给微软 How to: Download files with FTP

这是来自 http://www.csidata.com/?page_id=2828

的另一个示例代码
using System.Net;
using System.IO;

String RemoteFtpPath = "ftp://ftp.csidata.com:21/Futures.20150305.gz";
String LocalDestinationPath = "Futures.20150305.gz";
String Username="yourusername";
String Password = "yourpassword";
Boolean UseBinary = true; // use true for .zip file or false for a text file
Boolean UsePassive = false;

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(RemoteFtpPath);
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.KeepAlive = true;
request.UsePassive = UsePassive;
request.UseBinary = UseBinary;

request.Credentials = new NetworkCredential(Username, Password);

FtpWebResponse response = (FtpWebResponse)request.GetResponse();

Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);

using (FileStream writer = new FileStream(LocalDestinationPath, FileMode.Create))
{

    long length = response.ContentLength;
    int bufferSize = 2048;
    int readCount;
    byte[] buffer = new byte[2048];

    readCount = responseStream.Read(buffer, 0, bufferSize);
    while (readCount > 0)
    {
        writer.Write(buffer, 0, readCount);
        readCount = responseStream.Read(buffer, 0, bufferSize);
    }
}

reader.Close();
response.Close();