zoukankan      html  css  js  c++  java
  • uwp 下载文件显示进度并解压文件

    uwp 下载文件显示进度并解压文件。

    <Page
        x:Class="App4.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:App4"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d" 
        Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Width="909" Height="429">
        <Grid >
    
            <Grid Name="gridPercent" VerticalAlignment="Top" Height="57" Margin="183,0,0,0">
                <Rectangle Name="lbPercent"  VerticalAlignment="Top" Height="53" Margin="0" HorizontalAlignment="Left" Width="0" Fill="Blue"/>
            </Grid>
            <TextBlock Name="txt" Foreground="Red" Text="0%"  VerticalAlignment="Top" Height="53" Margin="200,0,7,0" HorizontalAlignment="Stretch"/>
    
    
    
            <Button x:Name="btnDownload" Background="WhiteSmoke" HorizontalAlignment="Left" Height="57" VerticalAlignment="Top" Width="178" Content="download" Click="BtnDownload_Click"  />
    
        </Grid>
    </Page>
    

      

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.IO.Compression;
    using System.Linq;
    using System.Runtime.InteropServices.WindowsRuntime;
    using System.Threading.Tasks;
    using Windows.Foundation;
    using Windows.Foundation.Collections;
    using Windows.Graphics.Imaging;
    using Windows.Storage;
    using Windows.Storage.Streams;
    using Windows.UI;
    using Windows.UI.Popups;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Controls.Primitives;
    using Windows.UI.Xaml.Data;
    using Windows.UI.Xaml.Input;
    using Windows.UI.Xaml.Media;
    using Windows.UI.Xaml.Media.Imaging;
    using Windows.UI.Xaml.Navigation;
    
    // The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
    
    namespace App4
    {
        /// <summary>
        /// An empty page that can be used on its own or navigated to within a Frame.
        /// </summary>
        public sealed partial class MainPage : Page
        {
            public MainPage()
            {
                this.InitializeComponent();
                Loaded += MainPage_Loaded;
    
            }
            private bool isDownloading = false;
    
            private async void MainPage_Loaded(object sender, RoutedEventArgs e)
            {
    
    
            }
    
            private void BtnDownload_Click(object sender, RoutedEventArgs e)
            {
                dowloadFile();
            }
    
    
    
            async void dowloadFile()
            {
    
                if (isDownloading) return;
    
                isDownloading = true;
                string serverUrl = "http://files.cnblogs.com/files/pcat/hackbar.zip";//"https://files.cnblogs.com/files/wgscd/jyzsUpdate.zip";
                bool isDownloadComplete = false;
                try
                {
                    System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(serverUrl);
                    System.Net.WebResponse response = await request.GetResponseAsync();
    
                    System.IO.Stream ns = response.GetResponseStream();
                    long totalSize = response.ContentLength;
                    double hasDownSize = 0;
                    byte[] nbytes = new byte[512];//521,2048 etc
                    int nReadSize = 0;
                    nReadSize = ns.Read(nbytes, 0, nbytes.Length);
                    StorageFolder folder;
                    folder = ApplicationData.Current.LocalFolder;
                    string localFile = "test.zip";
                    StorageFile file = await folder.CreateFileAsync(localFile, CreationCollisionOption.ReplaceExisting);
    
                    using (StorageStreamTransaction transaction = await file.OpenTransactedWriteAsync())
                    {
                        using (DataWriter dataWriter = new DataWriter(transaction.Stream))
                        {
                            while (nReadSize > 0)
                            {
    
                                dataWriter.WriteBytes(nbytes);
    
                                nReadSize = ns.Read(nbytes, 0, 512);
                                hasDownSize += nReadSize;
                                this.Invoke(new Action(() =>
                                {
                                    txt.Text = "" + (hasDownSize / 1024.0).ToString("0.00") + " KB/" + (totalSize / 1024.0).ToString("0.00") + " KB   (" + (((double)hasDownSize * 100 / totalSize).ToString("0")) + "%)";//显示下载百分比
                                    lbPercent.Width = gridPercent.RenderSize.Width * ((double)hasDownSize / totalSize);
                                    txt.UpdateLayout();
                                }));
    
                            }
    
                            transaction.Stream.Size = await dataWriter.StoreAsync();
                            await dataWriter.FlushAsync();
                            await transaction.CommitAsync();
                            isDownloadComplete = true;
                            this.Invoke(new Action(() =>
                            {
                                txt.Text = "100%";//显示下载百分比
                                txt.UpdateLayout();
                            }));
                            await new MessageDialog("download complete!").ShowAsync();
                            UnzipFile(localFile);
                        }
                    }
    
                }
                catch (Exception ex)
                {
                    await new MessageDialog("download error:" + ex.ToString()).ShowAsync();
                }
                isDownloading = false;
            }
    
    
            public async void Invoke(Action action, Windows.UI.Core.CoreDispatcherPriority Priority = Windows.UI.Core.CoreDispatcherPriority.Normal)
            {
    
                await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Priority, () => { action(); });
    
            }
    
    
    
    
            private async void UnzipFile(string zipFileName)
            {
    
                Random rnd = new Random();
    
                string existfile = "Elasticsearch.pptx";
                var localFolder = ApplicationData.Current.LocalFolder; //路径形如:C:UsersgwangAppDataLocalPackages347b02f6-8bb6-4c2c-a494-82f3fb42f42a_px2gx6zt1mshwLocalState
    
                //尝试删除旧文件
                var oldFile = await ApplicationData.Current.LocalFolder.TryGetItemAsync(existfile);
                if (oldFile != null)
                {
                    var file = await localFolder.GetFileAsync(existfile);
                    await file.DeleteAsync();
                }
                //开始解压
                var archive = await localFolder.GetFileAsync(zipFileName);//eg test.zip
                ZipFile.ExtractToDirectory(archive.Path, localFolder.Path + "\" + rnd.Next(1, 20000));//如果目标文件存在会异常
                await new MessageDialog("unzip done!").ShowAsync();
    
    
            }
    
    
            /// <summary>
            /// another sample, not know how to show download processs
            /// </summary>
            async void downloadFileUseHttpClient()
            {
    
                string serverUrl = "http://files.cnblogs.com/files/pcat/hackbar.zip";
                System.Net.Http.HttpClientHandler hand = new System.Net.Http.HttpClientHandler();
                //  System.Net.Http.MessageProcessingHandler processMessageHander = new System.Net.Http.MessageProcessingHandler();
                System.Net.Http.HttpClient localHttpClient = new System.Net.Http.HttpClient();
                System.Net.Http.HttpRequestMessage httpRequestMessage = new System.Net.Http.HttpRequestMessage(System.Net.Http.HttpMethod.Post, serverUrl);
                var resp = await localHttpClient.SendAsync(httpRequestMessage);
                Stream stream = await resp.Content.ReadAsStreamAsync();
                //............
    
            }
    
    
    
    
    
        }
    }
    

      

    另外一种方法是利用:System.Net.Http.HttpClient

      /// <summary>
            /// another sampe
            /// </summary>
            async void downloadFileUseHttpClient()
            {
    
                string serverUrl = "http://files.cnblogs.com/files/pcat/hackbar.zip";
                System.Net.Http.HttpClient localHttpClient = new System.Net.Http.HttpClient();
                var progress = new Progress<HttpDownloadProgress>(percent => {
                        txt.Text =""+ percent.BytesReceived+"/"+percent.TotalBytesToReceive;
                        txt.UpdateLayout();
                    });
    
                CancellationToken token=new CancellationToken();
                var data= await  HttpClientExtensions.GetByteArrayAsync(localHttpClient, new Uri(serverUrl), progress, token);
                var folder = ApplicationData.Current.LocalFolder; 
                string localFile = "test.zip";
                StorageFile file = await folder.CreateFileAsync(localFile, CreationCollisionOption.ReplaceExisting);
                using (StorageStreamTransaction transaction = await file.OpenTransactedWriteAsync())
                {
                    using (DataWriter dataWriter = new DataWriter(transaction.Stream))
                    {
                        dataWriter.WriteBytes(data.ToArray());
                        transaction.Stream.Size = await dataWriter.StoreAsync();
                        await dataWriter.FlushAsync();
                        await transaction.CommitAsync();
                    }
    
                }
    
    
            }
    
    
     
    
        public static class HttpClientExtensions
        {
            private const int BufferSize = 8192;
    
            public static async Task<byte[]> GetByteArrayAsync(this HttpClient client, Uri requestUri, IProgress<HttpDownloadProgress> progress, CancellationToken cancellationToken)
            {
                if (client == null)
                {
                    throw new ArgumentNullException(nameof(client));
                }
    
                using (var responseMessage = await client.GetAsync(requestUri, HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false))
                {
                    responseMessage.EnsureSuccessStatusCode();
    
                    var content = responseMessage.Content;
                    if (content == null)
                    {
                        return Array.Empty<byte>();
                    }
    
                    var headers = content.Headers;
                    var contentLength = headers.ContentLength;
                    using (var responseStream = await content.ReadAsStreamAsync().ConfigureAwait(false))
                    {
                        var buffer = new byte[BufferSize];
                        int bytesRead;
                        var bytes = new List<byte>();
    
                        var downloadProgress = new HttpDownloadProgress();
                        if (contentLength.HasValue)
                        {
                            downloadProgress.TotalBytesToReceive = (ulong)contentLength.Value;
                        }
                        progress?.Report(downloadProgress);
    
                        while ((bytesRead = await responseStream.ReadAsync(buffer, 0, BufferSize, cancellationToken).ConfigureAwait(false)) > 0)
                        {
                            bytes.AddRange(buffer.Take(bytesRead));
    
                            downloadProgress.BytesReceived += (ulong)bytesRead;
                            progress?.Report(downloadProgress);
                        }
    
                        return bytes.ToArray();
                    }
                }
            }
        
    
    
        public struct HttpDownloadProgress
        {
            public ulong BytesReceived { get; set; }
    
            public ulong? TotalBytesToReceive { get; set; }
        }
    

      

  • 相关阅读:
    Css进阶
    Css布局
    遇到的小问题
    MySQL 8.017连接Navicat中出现的问题
    ConcurrentHashMap图文源码解析
    HashMap图文源码解析
    接口和抽象类
    dependencies 和 devDependencies
    2020.7.7第二天
    2020.7.6第一天
  • 原文地址:https://www.cnblogs.com/wgscd/p/13633001.html
Copyright © 2011-2022 走看看