2011-12-27 93 views
3

我从ftp到本地文件夹复制文件夹结构,然后复制包含在其中的所有文件梅索德:如何从ftp保存文件?

public void CreateDirectories() 
{ 
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(Url); 
    request.Credentials = new NetworkCredential(Login, Pass); 
    request.Method = WebRequestMethods.Ftp.ListDirectory; 

    string soursePath = @"L:\Test"; 

    StreamReader streamReader = new StreamReader(request.GetResponse().GetResponseStream()); 

    string directoryName = streamReader.ReadLine(); 

    while (directoryName != null) 
    { 
     //Create directories structure 
     if (directoryName.StartsWith("I") && !directoryName.Contains("p")) 
     { 
      string newPath = System.IO.Path.Combine(soursePath, directoryName); 
      if (!System.IO.Directory.Exists(newPath)) 
      { 
       System.IO.Directory.CreateDirectory(newPath); 

       //get file list and invoke DownLoad(string directoryName, string fileName) 
       FtpWebRequest fileRequest = (FtpWebRequest)WebRequest.Create(Url + directoryName + "/"); 
       fileRequest.Credentials = new NetworkCredential(Login, Pass); 
       fileRequest.Method = WebRequestMethods.Ftp.ListDirectory; 

       StreamReader fileStreamReader = new StreamReader(fileRequest.GetResponse().GetResponseStream()); 
       string fileName = fileStreamReader.ReadLine(); 
       while (fileName != null) 
       { 
        DownLoad(directoryName, fileName); 
        fileName = streamReader.ReadLine(); 
       } 

      } 
     } 

     directoryName = streamReader.ReadLine(); 
    } 

    request = null; 
    streamReader = null; 
} 

是复制当前文件和梅索德:

public void DownLoad(string directoryName, string fileName) 
{ 
    string localPath = @"L:\Test\" + directoryName; 

    FtpWebRequest requestFileDownload = (FtpWebRequest)WebRequest.Create("ftp://ftp.equip.me/prod/" + directoryName + "/" + fileName); 
    requestFileDownload.Credentials = new NetworkCredential(Login, Pass); 
    requestFileDownload.Method = WebRequestMethods.Ftp.DownloadFile; 

    FtpWebResponse responseFileDownload = (FtpWebResponse)requestFileDownload.GetResponse(); 

    Stream responseStream = responseFileDownload.GetResponseStream(); 
    FileStream writeStream = new FileStream(localPath + "\\" + fileName, 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); 
    } 

    responseStream.Close(); 
    writeStream.Close(); 

    requestFileDownload = null; 
    responseFileDownload = null; 
} 

但行Stream responseStream = responseFileDownload.GetResponseStream();它停止将近40秒,然后抛出暂停超时,并且没有一个文件尚未保存(文件很小 - 50 kb)

+2

是你的防火墙开放FTP请求? – rene 2011-12-27 12:54:31

+0

保存文件夹结构正在工作,所以问题不与防火墙相关联 – revolutionkpi 2011-12-27 13:35:52

+0

它是否失败的特定文件?在特定的目录中?也许FTP服务器限制了活动连接的数量(当你开始下载时你已经有两个连接) – rene 2011-12-27 13:53:08

回答

0

您应该尝试的第一件事是关闭passive mode,因为这是自动的被大多数防火墙阻止,但是ftpWebRequest的默认操作模式。

略低于该行:

requestFileDownload.Method = WebRequestMethods.Ftp.DownloadFile; 

这一个:

requestFileDownload.UsePassive = false;