2014-04-25 38 views
0

我在一個ftp服務器上有一些zip文件,我想通過代碼下載,但每次下載它們並嘗試打開它們時,它們都已損壞。如何通過代碼下載.zip文件?

FtpClient conn = new FtpClient(); 

    conn.Host = ftpFtpServerAddress; 
    conn.Credentials = new NetworkCredential(ftpSrcUsername, ftpSrcPwd); 
    var files = conn.GetListing(ftpSrcFolder, FtpListOption.Modify | FtpListOption.Size); 

    foreach (var file in files) 
    { 
     conn.BeginOpenRead(file.FullName, 
      new AsyncCallback(BeginOpenReadCallback), new AsyncArguments() 
      { 
       Client = conn, 
       FileName = file.Name 
      }); 
    } 

    private void BeginOpenReadCallback(IAsyncResult ar) 
    {   
     AsyncArguments args = (AsyncArguments)ar.AsyncState; 
     FtpClient conn = args.Client; 

     Stream istream = conn.EndOpenRead(ar); 
     using (System.IO.FileStream fs = System.IO.File.Create(@"C:\temp\" + args.FileName)) 
     { 
      byte[] bytes = new byte[istream.Length + 10]; 
      int numBytesToRead = (int)istream.Length; 
      fs.Write(bytes, 0, numBytesToRead); 
     }      
    } 
+1

查找WebClient類。下載一個文件是3行代碼。 –

+0

我會懷疑問題出在您的異步回調。我使用類似的FTP代碼來拉取zip文件,然後解壓縮,沒有任何問題。 – evanmcdonnal

+0

我正在使用「System.Net.FtpClient;」爲ftp。會有什麼問題? – chobo2

回答

0

現在用stream.Read。雖然這種方法適用於小文件,但不應該將它用於非常大的文件,因爲它會非常快速地填滿內存,並且大於2 GB的文件的字節大小不能存儲爲int32。

private void BeginOpenReadCallback(IAsyncResult ar) 
    { 
     AsyncObject args = (AsyncObject)ar.AsyncState; 
     FtpClient conn = args.conn; 

     Stream istream = conn.EndOpenRead(ar); 
     using (System.IO.FileStream fs = System.IO.File.Create(@"C:\temp\" + args.filename)) 
     { 
      byte[] bytes = new byte[istream.Length]; 
      int bytesread = istream.Read(bytes, 0, bytes.Length); 
      fs.Write(bytes, 0, bytesread); 
     } 
    }