如何从特定文件夹的ftp​​下载文件

时间:2015-10-31 09:03:05

标签: c# .net winforms streamreader

我创建了一个Windows窗体,用于从特定文件夹中下载ftp文件。

用户将ftp详细信息与用户名和密码以及文件夹名称放在一起,文件将从中下载所有文件。这将由用户设置一次,并且每天都会下载ftp describe文件夹中的所有文件  关于FTP文件夹名称的例子是MyFolder,其中a.docx,b.docx等它将下载a.docx,b.docx每天不需要下载其他文件夹数据。

对于我下面使用的下载和文件列表功能。你能告诉我我做错了什么,或者我怎么能这样做。

 private void downloadFileFromFTP()
 {
    try
    {
        string[] files = GetFileList();
        foreach (string file in files)
        {
            Download(file);
        }
    }
    catch (Exception ex)
    {
    }
}

获取文件列表

public string[] GetFileList()
{
    string[] downloadFiles;
    StringBuilder result = new StringBuilder();
    WebResponse response = null;
    StreamReader reader = null;
    try
    {
        FtpWebRequest reqFTP;
        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri( "ftp://" + txtftpAddress.Text + "/")); //txtFtpAddress.Text + "/" + txtFTPFolderName + "/" + file
        reqFTP.UseBinary = true;
        reqFTP.Credentials = new NetworkCredential("UserNm", "passwd");
        reqFTP.Method = WebRequestMethods.Ftp .ListDirectory;
        reqFTP.Proxy = null;
        reqFTP.KeepAlive = false;
        reqFTP.UsePassive = false;
        response = reqFTP.GetResponse();
        reader = new StreamReader(response.GetResponseStream());
        string line = reader.ReadLine();
        while (line != null)
        {
            result.Append(line);
            result.Append("\n");
            line = reader.ReadLine();
        }
        // to remove the trailing '\n'
        result.Remove(result.ToString().LastIndexOf('\n'), 1);
        return result.ToString().Split('\n');
    }
    catch (Exception ex)
    {
        if (reader != null)
        {
            reader.Close();
        }
        if (response != null)
        {
            response.Close();
        }
        downloadFiles = null;
        return downloadFiles;
    }
}

从文件夹

下载文件
private void Download(string file)
{                       
    try
    {                             
        string uri = "ftp://" + txtFtpAddress.Text.Trim() + "/" + "txtlodername.Text" + "/" + file;

        Uri serverUri = new Uri(uri);
        if (serverUri.Scheme != Uri.UriSchemeFtp)
        {
            return;
        }       
        FtpWebRequest reqFTP;                
        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(txtFtpAddress.Text + "/" + txtFTPFolderName + "/" + file));                                
        reqFTP.Credentials = new NetworkCredential("UserName", "mypass");                
        reqFTP.KeepAlive = false;                
        reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;                                
        reqFTP.UseBinary = true;
        reqFTP.Proxy = null;                 
        reqFTP.UsePassive = false;
        FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
        Stream responseStream = response.GetResponseStream();
        FileStream writeStream = new FileStream("D\\Temp"  + file, FileMode.Create);                
        int Length = 2048;
        Byte[] buffer = new Byte[Length];
        int bytesRead = responseStream.Read(buffer, 0, Length);               
        while (bytesRead > 0)
        {
            writeStream.Write(buffer, 0, bytesRead);
            bytesRead = responseStream.Read(buffer, 0, Length);
        }                
        writeStream.Close();
        response.Close(); 
    }
    catch (WebException wEx)
    {
        MessageBox.Show(wEx.Message, "Download Error");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Download Error");
    }
}

1 个答案:

答案 0 :(得分:2)

我认为Download方法的3行必须按如下方式更正:

1

string uri = "ftp://" + txtFtpAddress.Text.Trim() + "/" + "txtlodername.Text" + "/" + file;

应该是:

string uri = "ftp://" + txtFtpAddress.Text.Trim() + "/" + txtFTPFolderName.Text.Trim() + "/" + file;


2。

reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(txtFtpAddress.Text + "/" + txtFTPFolderName + "/" + file));

应该是:

reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));


3.

FileStream writeStream = new FileStream("D\\Temp"  + file, FileMode.Create);  

应该是:

FileStream writeStream = new FileStream("D:\\Temp\\"  + file, FileMode.Create);