zoukankan      html  css  js  c++  java
  • WPF多线程下载文件,有进度条

      //打开对话框选择文件

            private void OpenDialogBox_Click(object sender, RoutedEventArgs e)
            {
                var openFileDialog = new OpenFileDialog();
                openFileDialog.Filter = "*|*";
                openFileDialog.RestoreDirectory = true;
                openFileDialog.ShowDialog();
                //包含路径的文件名
                var fileNames = openFileDialog.FileName;
                //文件名
                var name = openFileDialog.SafeFileName;
                DownLoadBox.Text = fileNames;
                DownLoadBox.Tag = name;
            }
     
            //点击下载下载文件
            private void DownLoadButton_Click(object sender, RoutedEventArgs e)
            {
                string filePath = DownLoadBox.Text;
                string name = DownLoadBox.Tag.ToString();
                if (string.IsNullOrEmpty(name)) return;
                if (filePath == null) return;
                var file = new FileInfo(filePath);
                //取到文件的总想长度
                long length = file.Length;
     
                #region 添加进度条
                var stackpael = new StackPanel()
                    {
                        Margin = new Thickness(0, 3, 0, 5)
                    };
     
                var lable = new System.Windows.Controls.Label();
     
                var progressbar = new ProgressBar()
                {
                    Margin = new Thickness(10, 10, 0, 13),
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment = VerticalAlignment.Top,
                    Width = 300,
                    Height = 30,
                    Maximum = length
                };
     
                stackpael.Children.Add(lable);
                stackpael.Children.Add(progressbar);
                DownLoadStackPanel.Children.Add(stackpael);
                //创建实体,以方便多线程传值
                Controls control = new Controls();
                control.Lable = lable;
                control.Name = name;
                control.Progressbar = progressbar;
                control.Path = filePath; 
                #endregion
     
                //使用线程池下载文件
                ThreadPool.QueueUserWorkItem(new WaitCallback(DownLoad), control);
     
            }
     
            #region 使用线程池下载文件void DownLoad(object control)
            /// <summary>
            /// 使用线程池下载文件
            /// </summary>
            /// <param name="control"> 参数</param>
            private void DownLoad(object control)
            {
                var controls = control as Controls;
                string name = controls.Name;
                string filePath = controls.Path;
                System.Windows.Controls.Label lable = controls.Lable;
                ProgressBar progressBar = controls.Progressbar;
                //存放下载文件的路径
                string newPath = Path.GetFullPath("../../File");
                if (name == null || filePath == null || lable == null || progressBar == null) return;
                //下载
                DownLoadFile(name, filePath, newPath, lable, progressBar);
            } 
            #endregion
     
            #region 下载void DownLoadFile(string name, string filePath, string newPath, System.Windows.Controls.Label lable, ProgressBar progressBar)
            /// <summary>
            /// 下载
            /// </summary>
            /// <param name="name">文件名</param>
            /// <param name="filePath">文件路径</param>
            /// <param name="newPath">存放文件的路径</param>
            /// <param name="lable">存放文件名的控件</param>
            /// <param name="progressBar">进度条</param>
            private void DownLoadFile(string name, string filePath, string newPath, System.Windows.Controls.Label lable, ProgressBar progressBar)
            {
                newPath = newPath + "\" + Guid.NewGuid() + name;
                //FileMode.Create创建文件   FileMode.Open 打开文件
                using (Stream so = new FileStream(newPath, FileMode.Create))
                {
                    using (Stream st = new FileStream(filePath, FileMode.Open))
                    {
                        byte[] by = new byte[1024 * 1024 * 100];
                        int osize = st.Read(by, 0, (int)by.Length);
                        int lengths = osize;
                        //被主线程调用
                        Action a = () =>
                        {
                            lable.Content = name;
                        };
                        this.Dispatcher.BeginInvoke(a);
     
                        while (osize > 0)
                        {
                            so.Write(by, 0, osize);
                            osize = st.Read(by, 0, (int)by.Length);
                            lengths += osize;
                            Action action = () =>
                            {

                                 //进度条

                                progressBar.Value = lengths;
                            };
                            progressBar.Dispatcher.BeginInvoke(action);
                        }
                    }
                }
            } 
            #endregion
  • 相关阅读:
    通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(三)
    通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(二)
    stepper组件使用
    解决循环删除list中元素ConcurrentModificationException异常问题
    简单选择排序SelectSort
    用js写出简单的计算器
    在一个项目中,添加.js文件出现错误
    弹出当前值以及修改
    映射:表之间的关联
    置换(用递归的方法执行置换)
  • 原文地址:https://www.cnblogs.com/xiaoyaodijun/p/4071436.html
Copyright © 2011-2022 走看看