1

I am trying to download and save a file in the isolated storage. This is my attempt of downloading the file

Task.Run(async () => { await DownloadFileFromWeb(new Uri(@"http://main.get4mobile.net/ringtone/ringtone/ibMjbqEYMHUnso8MErZ_UQ/1452584693/fa1b23bb5e35c8aed96b1a5aba43df3d/stefano_gambarelli_feat_pochill-land_on_mars_v2.mp3"), "mymp3.mp3"); }).Wait();

        public static Task<Stream> DownloadFile(Uri url)
        {
            var tcs = new TaskCompletionSource<Stream>();
            var wc = new WebClient();
            wc.OpenReadCompleted += (s, e) =>
            {
                if (e.Error != null) tcs.TrySetException(e.Error);
                else if (e.Cancelled) tcs.TrySetCanceled();
                else tcs.TrySetResult(e.Result);
            };
            wc.OpenReadAsync(url);
            return tcs.Task;
        }

        public static async Task<Problem> DownloadFileFromWeb(Uri uriToDownload, string fileName)
        {
            using (Stream mystr = await DownloadFile(uriToDownload))
            using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
            {
                using (IsolatedStorageFileStream file = new IsolatedStorageFileStream(fileName, FileMode.OpenOrCreate, isf))
                {
                    using (var fs = new StreamWriter(file))
                    {
                        byte[] bytesInStream = new byte[mystr.Length];
                        mystr.Read(bytesInStream, 0, (int)bytesInStream.Length);
                        file.Write(bytesInStream, 0, bytesInStream.Length);
                        file.Flush();
                    }
                }
            }
            return Problem.Ok;
        }

Obviously I am doing something wrong here since the file is never and the app is stack forever after the call. However I believe I am not far from getting there.

Any help is greatly appreciated.

Alejandro
  • 308
  • 2
  • 11

2 Answers2

0

Add this methid and call it from there, it should work.

Downlaod_Click()
public static async void Downlaod_Click()
        {
            var cts = new CancellationTokenSource();
            Problem fileDownloaded = await MainHelper.DownloadFileFromWeb(new Uri(@"url", UriKind.Absolute), "myfile.mp3", cts.Token);
            switch (fileDownloaded)
            {
                case Problem.Ok:
                    MessageBox.Show("File downloaded");
                    break;
                case Problem.Cancelled:
                    MessageBox.Show("Download cancelled");
                    break;
                case Problem.Other:
                default:
                    MessageBox.Show("Other problem with download");
                    break;
            }
        }
user2530266
  • 287
  • 3
  • 18
-1

IsolatedStorage is not available in windows 8.1. So you might use following code for Windows 8.1 app, which works fine:

 Task.Run(async () => { await DownloadFileFromWeb(new Uri(@"http://main.get4mobile.net/ringtone/ringtone/ibMjbqEYMHUnso8MErZ_UQ/1452584693/fa1b23bb5e35c8aed96b1a5aba43df3d/stefano_gambarelli_feat_pochill-land_on_mars_v2.mp3"), "mymp3.mp3"); }).Wait();

    public static async Task<Stream> DownloadFile(Uri url)
    {
        var tcs = new TaskCompletionSource<Stream>();

        HttpClient http = new System.Net.Http.HttpClient();
        HttpResponseMessage response = await http.GetAsync(url);

            MemoryStream stream = new MemoryStream();
            ulong length = 0;
            response.Content.TryComputeLength(out length);
            if (length > 0)
                await response.Content.WriteToStreamAsync(stream.AsOutputStream());

            stream.Position = 0;
            return stream;

    }

    public static async Task<string> DownloadFileFromWeb(Uri uriToDownload, string fileName)
    {
        using (Stream stream = await DownloadFile(uriToDownload))
        {
            StorageFolder local = Windows.Storage.ApplicationData.Current.LocalFolder;
            var file = await local.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
            stream.Position = 0;
            using (Stream fileStream = await file.OpenStreamForWriteAsync())
            {
                stream.CopyTo(fileStream);
            }
            return file.Path;
        }
    }
Community
  • 1
  • 1
Vishnu
  • 2,135
  • 2
  • 30
  • 51