2011-11-22 11 views
5

पर फ़ाइल डाउनलोड करें, जहां तक ​​मैं एक यूआरएल से एक स्ट्रीम में फ़ाइल डाल रहा हूं। हालांकि ईवेंट के अंदर puttin savefiledialog OpenReadCompleted एक अपवाद देता है क्योंकि savefiledialog को उपयोगकर्ता इनियेटेड ईवेंट से निकाल दिया जाना चाहिए। savefiledialog को डालने के अंदर नहीं OpenReadCompleted एक त्रुटि देता है क्योंकि बाइट्स सरणी खाली है, अभी तक संसाधित नहीं है। क्या किसी ईवेंट का उपयोग किये बिना यूरी से स्ट्रीम करने के लिए फ़ाइल को सहेजने का कोई और तरीका है?पूर्ण यूरी से धारा में फ़ाइल को SaveFileDialog

public void SaveAs() 
{ 
WebClient webClient = new WebClient(); //Provides common methods for sending data to and receiving data from a resource identified by a URI. 
     webClient.OpenReadCompleted += (s, e) => 
              { 
               Stream stream = e.Result; //put the data in a stream 
               MemoryStream ms = new MemoryStream(); 
               stream.CopyTo(ms); 
               bytes = ms.ToArray(); 
              }; //Occurs when an asynchronous resource-read operation is completed. 
     webClient.OpenReadAsync(new Uri("http://testurl/test.docx"), UriKind.Absolute); //Returns the data from a resource asynchronously, without blocking the calling thread. 

     try 
     { 
     SaveFileDialog dialog = new SaveFileDialog(); 
     dialog.Filter = "All Files|*.*"; 

     //Show the dialog 
     bool? dialogResult = dialog.ShowDialog(); 

     if (dialogResult != true) return; 

     //Get the file stream 
     using (Stream fs = (Stream)dialog.OpenFile()) 
     { 
      fs.Write(bytes, 0, bytes.Length); 
      fs.Close(); 

      //File successfully saved 
     } 
     } 
     catch (Exception ex) 
     { 
      //inspect ex.Message 
      MessageBox.Show(ex.ToString()); 
     } 

} 

उत्तर

7

तरीका अपनाने के लिए पहले खोलने SaveFileDialog एक बटन क्लिक जैसे कुछ उपयोगकर्ता संपर्क का एक परिणाम के रूप में है। उपयोगकर्ता को यह निर्धारित करने के लिए कि डाउनलोड को कहां से सहेजना है और SaveDialog विधि वापस आ गई है, तो आप उस उदाहरण को SaveFileDialog पर रखें।

फिर आप डाउनलोड आह्वान और OpenReadCompleted में आप एक धारा प्राप्त करने के लिए जो आप परिणाम पंप कर सकते हैं करने के लिए SaveFileDialogOpenFile विधि का उपयोग कर सकते हैं।

public void SaveAs() 
{ 
    SaveFileDialog dialog = new SaveFileDialog(); 
    dialog.Filter = "All Files|*.*"; 

    bool? dialogResult = dialog.ShowDialog(); 

    if (dialogResult != true) return; 

    WebClient webClient = new WebClient(); 
    webClient.OpenReadCompleted += (s, e) => 
    { 
     try 
     {  
      using (Stream fs = (Stream)dialog.OpenFile()) 
      { 
       e.Result.CopyTo(fs); 
       fs.Flush(); 
       fs.Close(); 
      } 

     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    }; 
    webClient.OpenReadAsync(new Uri("http://testurl/test.docx"), UriKind.Absolute); 
} 

आप ध्यान दें हूँ कि न केवल कोड क्लीनर और सरल है, लेकिन उपयोगकर्ता SaveFileDialog रद्द आप अपने समय या बैंडविड्थ कोई फ़ाइल डाउनलोड करना व्यर्थ नहीं है समाप्त होता है।

+0

यह पूरी तरह से काम करता है! मैंने इसके बारे में क्यों नहीं सोचा। शायद क्योंकि मैं एक नौसिखिया हूँ। बहुत बहुत धन्यवाद। – tutu

0

मुझे चांदी के आवेदन से फ़ाइल डाउनलोड करने का आसान तरीका मिला। हाइपरलिंक बटन नियंत्रण का उपयोग करें।

आप भी "टार्गेटनाम" प्रॉपर्टी का उपयोग कर लक्ष्य निर्दिष्ट कर सकते हैं।

+1

यह एक टिप्पणी के रूप में अधिक उपयुक्त है। –

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