2011-01-04 10 views
6

मैं एक प्रगति पट्टी के साथ एक FTP सर्वर से एक फ़ाइल डाउनलोड करने की कोशिश कर रहा हूँ।प्रगति के साथ एफ़टीपी से फ़ाइल डाउनलोड करें - टोटलबाइट्स ट्राइसेव हमेशा -1 है?

फ़ाइल डाउनलोड हो रही है, और प्रोग्रेस चेंज इवेंट कॉल कर रहा है, घटना के अलावा कुलबेट्स टॉरेसीव हमेशा -1 है। कुल बाइट बढ़ता है, लेकिन मैं कुल के बिना प्रतिशत की गणना करने में असमर्थ हूं।

मुझे लगता है कि मैं अन्य ftp कमांड के माध्यम से फ़ाइल का आकार पा सकता हूं, लेकिन मुझे आश्चर्य है कि यह क्यों काम नहीं करता है?

मेरे कोड:

FTPClient request = new FTPClient(); 
request.Credentials = credentials; 
request.DownloadProgressChanged += new DownloadProgressChangedEventHandler(request_DownloadProgressChanged); 
//request.DownloadDataCompleted += new DownloadDataCompletedEventHandler(request_DownloadDataCompleted); 
request.DownloadDataAsync(new Uri(folder + file)); 
while (request.IsBusy) ; 

....

static void request_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
{ 
    if (e.TotalBytesToReceive == -1) 
    { 
     l.reportProgress(-1, FormatBytes(e.BytesReceived) + " out of ?"); 
    } 
    else 
    { 
     l.reportProgress(e.ProgressPercentage, "Downloaded " + FormatBytes(e.BytesReceived) + " out of " + FormatBytes(e.TotalBytesToReceive) + " (" + e.ProgressPercentage + "%)"); 
    } 
} 

....

class FTPClient : WebClient 
{ 
    protected override WebRequest GetWebRequest(System.Uri address) 
    { 
     FtpWebRequest req = (FtpWebRequest)base.GetWebRequest(address); 
     req.UsePassive = false; 
     return req; 
    } 
} 

धन्यवाद।

+0

आप बेहतर कार्यान्वयन प्रदान करना होगा इसे संभालने के लिए 'वेब क्लाइंट'। ओवरराइड करने के लिए दिलचस्प गुण/विधियों की तलाश करें। – leppie

+0

'वेब क्लाइंट' पर एक नज़र डाली, लेकिन यह बहुत सारे हैक्स के बिना लागू करने के लिए असंभव लगता है। – leppie

उत्तर

-1

एफ़टीपी आपको एचटीटीपी जैसी सामग्री के आकार नहीं देता है, तो आप शायद इसे अपने आप बेहतर कर सकते हैं।

FtpWebRequest FTPWbReq = WebRequest.Create("somefile") as FtpWebRequest; 
FTPWbReq .Method = WebRequestMethods.Ftp.GetFileSize; 

FtpWebResponse FTPWebRes = FTPWbReq.GetResponse() as FtpWebResponse; 
long length = FTPWebRes.ContentLength; 
FTPWebRes.Close(); 
4

तो मुझे एक ही समस्या थी। मैं फ़ाइल आकार को पुनः प्राप्त करके इसे चारों ओर मिला।

 // Get the object used to communicate with the server. 
     FtpWebRequest request = (FtpWebRequest)WebRequest.Create("URL"); 
     request.Method = WebRequestMethods.Ftp.GetFileSize; 
     request.Credentials = networkCredential; 
     FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 

     Stream responseStream = response.GetResponseStream(); 
     bytes_total = response.ContentLength; //this is an int member variable stored for later 
     Console.WriteLine("Fetch Complete, ContentLength {0}", response.ContentLength); 
     response.Close(); 

     webClient = new MyWebClient(); 
     webClient.Credentials = networkCredential; ; 
     webClient.DownloadDataCompleted += new DownloadDataCompletedEventHandler(FTPDownloadCompleted); 
     webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(FTPDownloadProgressChanged); 
     webClient.DownloadDataAsync(new Uri("URL")); 

फिर कॉलबैक में गणित करें।

private void FTPDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
{ 
    progressBar.Value = (int)(((float)e.BytesReceived/(float)bytes_total) * 100.0); 
} 
0

समाधान FtpWebRequest और Task का उपयोग कर:

private void button1_Click(object sender, EventArgs e) 
{ 
    // Run Download on background thread 
    Task.Run(() => Download()); 
} 

private void Download() 
{ 
    try 
    { 
     const string url = "ftp://ftp.example.com/remote/path/file.zip"; 
     NetworkCredential credentials = new NetworkCredential("username", "password"); 

     // Query size of the file to be downloaded 
     WebRequest sizeRequest = WebRequest.Create(url); 
     sizeRequest.Credentials = credentials; 
     sizeRequest.Method = WebRequestMethods.Ftp.GetFileSize; 
     int size = (int)sizeRequest.GetResponse().ContentLength; 

     progressBar1.Invoke(
      (MethodInvoker)(() => progressBar1.Maximum = size)); 

     // Download the file 
     WebRequest request = WebRequest.Create(url); 
     request.Credentials = credentials; 
     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); 
       int position = (int)fileStream.Position; 
       progressBar1.Invoke(
        (MethodInvoker)(() => progressBar1.Value = position)); 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     MessageBox.Show(e.Message); 
    } 
} 

enter image description here

कोर डाउनलोड कोड आधारित है पर: ऐसा लगता है
Upload and download a binary file to/from FTP server in C#/.NET

संबंधित मुद्दे