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:\Users\gwang\AppData\Local\Packages\347b02f6-8bb6-4c2c-a494-82f3fb42f42a_px2gx6zt1mshw\LocalState //尝试删除旧文件
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; }
}

  

uwp 下载文件显示进度并解压文件的更多相关文章

  1. axios下载文件乱码问题 无法解压 文件损坏

    /* 下载附件 */ downloadFile(fileName) { // window.open(url); var that = this; var url = "PO2116&quo ...

  2. Linux命令(16)压缩,解压文件

    tar: 简介:tar命令只是把目录打包成一个归档(文件),并不负责压缩.在tar命令中可以带参数调用gzip或bzip2压缩.因为gzip和bzip2只能压缩单个文件. 在linux下是不需要后缀名 ...

  3. HDFS中文件的压缩与解压

    HDFS中文件的压缩与解压 文件的压缩有两大好处:1.可以减少存储文件所需要的磁盘空间:2.可以加速数据在网络和磁盘上的传输.尤其是在处理大数据时,这两大好处是相当重要的. 下面是一个使用gzip工具 ...

  4. VC下载文件显示进度条

    VC下载文件显示进度条 逗比汪星人2009-09-18上传   by Koma http://blog.csd.net/wangningyu http://download.csdn.net/deta ...

  5. .NET使用ICSharpCode.SharpZipLib压缩/解压文件

    SharpZipLib是国外开源加压解压库,可以方便的对文件进行加压/解压 1.下载ICSharpCode.SharpZipLib.dll,并复制到bin目录下 http://www.icsharpc ...

  6. AIX系统上压缩与解压文件

    压缩. 命令格式: #tar -cvf (或xvf)+文件名+设备 C:是本地到其他设备 x:是其他设备到本地 r:是追加,比如打包时,将其他文件追加进来使用该参数. t:显示tar包里的内容,但还原 ...

  7. linux下tar gz bz2 tgz z等众多压缩文件的压缩与解压方法

    Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的.生成tar包后,就可以用其它的程序来进 行压缩了,所以首先就来讲讲ta ...

  8. (转)使用 linux tar 命令压缩与解压文件

    原文链接 http://www.cnblogs.com/qq78292959/archive/2011/07/06/2099427.html tar -c: 建立压缩档案-x:解压-t:查看内容-r: ...

  9. java 压缩以及解压文件,有tar,zip,gz(gizp)和解压

    package com.yabsz.decompCompr; import java.io.File; import java.util.ArrayList; import java.util.Lis ...

  10. Linux学习笔记之AIX系统上压缩与解压文件

    0x00 概述 AIX机器真难用,一时半会还真适应不了.   0x01 压缩tar 命令格式: # tar -cvf (或xvf)+文件名+设备 C:是本地到其他设备 x:是其他设备到本地 r:是追加 ...

随机推荐

  1. uniswap v2 类比

    当然,以下是生活中的类比,帮助你理解 Uniswap V2 的核心概念: 1. 自动化做市商(AMM) 生活中的例子:自动售货机 解释:自动售货机内部有一种商品(如饮料)和一定的库存.用户通过投币购买 ...

  2. PHP Excel Word 文件转 HTML输出

    ob_end_clean(); $filePath = './123.xls'; //$filePath = './123.docx'; $savePath = './123.html'; //这里记 ...

  3. 八、Spring Boot集成Spring Security之前后分离认证最佳实现对接测试

    前言 本文介绍前后分离认证最佳实现的对接测试,使用postman或者其他熟悉的测试工具,配合以下内容观看效果更佳!!! 什么是前后分离认证流程最佳方案,为什么这么设计?请查看六.Spring Boot ...

  4. 读书笔记-C#8.0本质论-06

    18.4 并行迭代 如果一个对CPU资源占用较大的计算可以很容易被分割为多个彼此完全独立的部分以任意顺序执行,则要使用并行循环.示例如下: using System; using System.Col ...

  5. Graylog之进阶操作

    有关系统的索引,权限,pipline 参考文章: https://mp.weixin.qq.com/s/LROHPjZEJPMsS5M_a3pPFw https://blog.csdn.net/wei ...

  6. 关于被static修饰还可序列化的问题

    今天为了验证一下被static修饰的变量到底可不可以序列化,出现了以下的情况: 然后找到一条评论,豁然开朗 把序列化的内容注释掉,直接从序列化文件读取对象,就发现没有获取到

  7. 编译器-FOLLOW集合

    语法分析器的两个重要函数 FIRST和FOLLOW 一.FOLLOW的定义 在句型中紧跟在A右边的终结符号的集合 如果A是某些句型的最右符号,那么$在FOLLOW(A)中 A:非终结符 二.计算方法 ...

  8. 《前端运维》一、Linux基础--08Shell其他及补充

    这一篇,我们来学习一些重要的命令,在工作中也会经常用到. 一.简单正则 要注意的是,有些命令不支持正则模式,比如fs.find等,有些是支持正则的,比如grep.awk.sed等.正则的语法和js中的 ...

  9. Flutter Package: flutter_animate

    Flutter package: flutter_animate A performant library that makes it simple to add almost any kind of ...

  10. PDFsharp 1.50

    PDFsharp 1.50 Preview Information - PDFsharp & MigraDoc PDFShapr 1.50 修复与改进 支持 Object Streams - ...