2012-07-06 25 views
9

मैं एक आसान समस्या से जूझ रहा हूं। मैं इस कोड का उपयोग वेब से कोई चित्र डाउनलोड करना चाहते: (। उदाहरण के लिए एप्लिकेशन की भंडारण में एक फ़ाइल id.jpg बनाने)WinRT StorageFile डाउनलोड फ़ाइल

WebRequest requestPic = WebRequest.Create(@"http://something.com/" + id + ".jpg"); 
WebResponse responsePic = await requestPic.GetResponseAsync(); 

अब मैं एक StorageFile में WebResponse की धारा लिखना चाहते थे, लेकिन मैं नहीं है इसे प्राप्त करने के लिए कोई रास्ता मिला। मैंने इसके लिए वेब की खोज की, लेकिन कोई सफलता नहीं - सभी तरीकों से असंगत स्ट्रीम प्रकार और इसी तरह।

क्या आप मदद कर सकते हैं?

उत्तर

12

मुझे निम्नलिखित समाधान मिल गया है, जो काम करता है और बहुत जटिल नहीं है।

public async static Task<StorageFile> SaveAsync(
     Uri fileUri, 
     StorageFolder folder, 
     string fileName) 
    { 
     var file = await folder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting); 
     var downloader = new BackgroundDownloader(); 
     var download = downloader.CreateDownload(
      fileUri, 
      file); 

     var res = await download.StartAsync();    

     return file; 
    } 
+0

ग्रेट उत्तर। सरल और यह पूरी तरह से काम करता है। "पूर्ण नहीं" फ़ाइलों को पढ़ने के दौरान कोई और समस्या नहीं है। दोस्त बहुत - बहुत धन्यवाद। – nicruo

+0

मेरी खुशी ;-)। –

7

आपको एक बफर में प्रतिक्रिया स्ट्रीम पढ़ने की आवश्यकता होगी, फिर डेटा को स्टोरेजफ़ाइल पर लिखें। वह निम्नलिखित कोड एक उदाहरण दिखाता है:

 var fStream = responsePic.GetResponseStream(); 
     var file = await ApplicationData.Current.LocalFolder.CreateFileAsync("testfile.txt"); 
     using (var ostream = await file.OpenStreamForWriteAsync()) 
     { 
      int count = 0; 
      do 
      { 
       var buffer = new byte[1024]; 
       count = fStream.Read(buffer, 0, 1024); 
       await ostream.WriteAsync(buffer, 0, count); 
      } 
      while (fStream.CanRead && count > 0); 
     }