2012-09-20 16 views
8

FtpWebRequestを使用してファイルをダウンロードしようとしています。それは、それをダウンロードしFtpWebRequestを使用したファイルのダウンロード

private FtpWebRequest CreateFtpWebRequest(string ftpDirectoryPath, string userName, string password, bool keepAlive = false) 
{ 
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(new Uri(ftpDirectoryPath)); 

    //Set proxy to null. Under current configuration if this option is not set then the proxy that is used will get an html response from the web content gateway (firewall monitoring system) 
    request.Proxy = null; 

    request.UsePassive = true; 
    request.UseBinary = true; 
    request.KeepAlive = keepAlive; 

    request.Credentials = new NetworkCredential(userName, password); 

    return request; 
} 

private void DownloadFile(string userName, string password, string ftpSourceFilePath, string localDestinationFilePath) 
{ 
    int bytesRead = 0; 
    byte[] buffer = new byte[1024]; 

    FtpWebRequest request = CreateFtpWebRequest(ftpSourceFilePath, userName, password, true); 
    request.Method = WebRequestMethods.Ftp.DownloadFile; 

    Stream reader = request.GetResponse().GetResponseStream(); 
    BinaryWriter writer = new BinaryWriter(File.Open(localDestinationFilePath, FileMode.CreateNew)); 

    while (true) 
    { 
     bytesRead = reader.Read(buffer, 0, buffer.Length); 

     if (bytesRead == 0) 
      break; 

     writer.Write(buffer, 0, bytesRead); 
    }   
} 

は、それは私が作成したこのCreateFtpWebRequestメソッドを使用しています。しかし、情報は常に壊れています。誰が何が起こっているのか知っていますか?

+0

「常に破損しています」とはどういう意味ですか?より具体的にしてください。 – PVitt

+0

私は別の問題を抱えていましたが、 'CreateFtpWebRequest'関数の' request.Proxy = null'行の上の記述コメントは私が持っていた問題を解決しました。したがって、upvote! – UnTraDe

答えて

23

はちょうどそれを考え出し:

private void DownloadFile(string userName, string password, string ftpSourceFilePath, string localDestinationFilePath) 
    { 
     int bytesRead = 0; 
     byte[] buffer = new byte[2048]; 

     FtpWebRequest request = CreateFtpWebRequest(ftpSourceFilePath, userName, password, true); 
     request.Method = WebRequestMethods.Ftp.DownloadFile; 

     Stream reader = request.GetResponse().GetResponseStream(); 
     FileStream fileStream = new FileStream(localDestinationFilePath, FileMode.Create); 

     while (true) 
     { 
      bytesRead = reader.Read(buffer, 0, buffer.Length); 

      if (bytesRead == 0) 
       break; 

      fileStream.Write(buffer, 0, bytesRead); 
     } 
     fileStream.Close();  
    } 

ではなく、FileStreamをを使用する必要がありました。

+0

"fileStream.Close();"を追加する必要がありますwhileループの後。それ以外の場合は、ダウンロードしたファイルが切り捨てられることがあります。 – nanonerd

+0

何か不足していますか、このソリューションは2kB未満のファイルしかダウンロードできませんか? – Chrisi

+1

バッファは、ダウンロードしているものの「チャンク」を保持するために使用されます。これらのチャンクは2kBサイズです。このループでは、2kBのチャンクはそれ以上なくなるまで読んでいます。 –

4

.NETフレームワークを使用してFTPサーバーからファイルをダウンロードするための最も些細な方法はWebClient.DownloadFile methodを使用している:

WebClient client = new WebClient(); 
client.Credentials = new NetworkCredential("username", "password"); 
client.DownloadFile(
    "ftp://ftp.example.com/remote/path/file.zip", @"C:\local\path\file.zip"); 

使用FtpWebRequest class、あなたはWebClientクラスが(のように提供していないことを、唯一のより大きな制御が必要な場合TLS/SSL暗号化、進捗監視など)。

FtpWebRequest request = 
    (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip"); 
request.Credentials = new NetworkCredential("username", "password"); 
request.Method = WebRequestMethods.Ftp.DownloadFile; 

using (Stream ftpStream = request.GetResponse().GetResponseStream()) 
using (Stream fileStream = File.Create(@"C:\local\path\file.zip")) 
{ 
    byte[] buffer = new byte[10240]; 
    int read; 
    while ((read = ftpStream.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     fileStream.Write(buffer, 0, read); 
     Console.WriteLine("Downloaded {0} bytes", fileStream.Position); 
    } 
} 
:チャンク自分で内容をコピーするために、あなたがダウンロードの進行状況を監視する必要がある場合

FtpWebRequest request = 
    (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip"); 
request.Credentials = new NetworkCredential("username", "password"); 
request.Method = WebRequestMethods.Ftp.DownloadFile; 

using (Stream ftpStream = request.GetResponse().GetResponseStream()) 
using (Stream fileStream = File.Create(@"C:\local\path\file.zip")) 
{ 
    ftpStream.CopyTo(fileStream); 
} 

のみ、あなたがしている:簡単な方法は、ちょうどStream.CopyTo方法を使用してFileStreamにFTPの応答ストリームをコピーすることですGUIの進捗(リサイズProgressBar)については

は、以下を参照してください。
FtpWebRequest FTP download with ProgressBar

リモートフォルダから全てのファイルをダウンロードしたい場合は、を参照してください C# Download all files and subdirectories through FTP

関連する問題