2011-12-27 92 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;