C#:复制文件显示进度条

2023-10-30

1.窗口界面
主要是文本框textBox、按钮button、进度条prograssBar三大组件所组成的。
在这里插入图片描述
2.完整代码

using System;
using System.IO;
using System.Windows.Forms;
using System.Threading;//线程序的命名空间
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;

namespace 复制文件显示进度
{
    public partial class FileCopyPlan : Form
    {
        public FileCopyPlan()
        {
            InitializeComponent();
        }
        private Thread thdCopyFile; //创建一个线程
        private string str = "";  //用来记录源文件的名字
        FileStream FormerOpen;  //实例化源文件FileStream类
        FileStream ToFileOpen;  //实例化目标文件FileStream类

        public void CopyFile(string FormerFile, string ToFile, int SectSize, ProgressBar progressBar1)
        {
            progressBar1.Value = 0;//设置进度条的当前位置为0
            progressBar1.Minimum = 0; //设置进度条的最小值为0

            //创建目的文件,如果已存在将被覆盖
            FileStream fileToCreate = new FileStream(ToFile, FileMode.Create);
            fileToCreate.Close();  //关闭所有fileToCreate的资源
            fileToCreate.Dispose();//释放所有fileToCreate的资源

            FormerOpen = new FileStream(FormerFile, FileMode.Open, FileAccess.Read);//以只读方式打开源文件
            ToFileOpen = new FileStream(ToFile, FileMode.Append, FileAccess.Write); //以写方式打开目的文件

            int max = Convert.ToInt32(Math.Ceiling((double)FormerOpen.Length / (double)SectSize));
            progressBar1.Maximum = max;
            int FileSize;

            if (SectSize <= FormerOpen.Length)  //如果分段拷贝,即每次拷贝内容小于文件总长度
            {
                byte[] buffer = new byte[SectSize]; //根据传输的大小,定义一个字节数组,用来存储传输的字节
                int copied = 0;//记录传输的大小
                int tem_n = 1; //设置进度栏中进度的增加个数
                while (copied <= ((int)FormerOpen.Length - SectSize))
                {
                    FileSize = FormerOpen.Read(buffer, 0, SectSize);//从0开始读到buffer字节数组中,每次最大读SectSize
                    FormerOpen.Flush(); //清空缓存
                    ToFileOpen.Write(buffer, 0, SectSize);     //向目的文件写入字节
                    ToFileOpen.Flush(); //清空缓存
                    ToFileOpen.Position = FormerOpen.Position; //是源文件的目的文件流的位置相同
                    copied += FileSize; //记录已经拷贝的大小
                    progressBar1.Value = progressBar1.Value + tem_n; //增加进度栏的进度块
                }
                int leftSize = (int)FormerOpen.Length - copied; //获取剩余文件的大小
                FileSize = FormerOpen.Read(buffer, 0, leftSize);//读取剩余的字节
                FormerOpen.Flush();
                ToFileOpen.Write(buffer, 0, leftSize);          //写入剩余的部分
                ToFileOpen.Flush();
            }
            else //如果整体拷贝,即每次拷贝内容大于文件总长度
            {
                byte[] buffer = new byte[FormerOpen.Length];        //获取文件大小
                FormerOpen.Read(buffer, 0, (int)FormerOpen.Length); //获取源文件大小
                FormerOpen.Flush();                                 //清空缓存
                ToFileOpen.Write(buffer, 0, (int)FormerOpen.Length);//写入字节
                ToFileOpen.Flush();                                 //清空缓存

            }

            FormerOpen.Close();//释放所有资源
            ToFileOpen.Close();//释放所有资源

            if (MessageBox.Show("复制完成") == DialogResult.OK)
            {
                progressBar1.Value = 0;//设置进度条当前位置为0
                textBox1.Clear();//清空文本
                textBox2.Clear();//清空文本
                str = "";
            }
        }

        public delegate void CopyFile_Delegate(); //定义委托/托管线程

        public void SetCopyFile()
        {
            //this.Invoke(new CopyFile_Delegate(RunCopyFile)); //对指定的线程进行托管
            //下面两行代码等同上面一行代码
            CopyFile_Delegate copyfile_delegate = new CopyFile_Delegate(RunCopyFile); //创建delegate对象
            this.Invoke(copyfile_delegate); //调用delegate           
        }

        public void RunCopyFile()
        {
            CopyFile(textBox1.Text, textBox2.Text + "\\" + str, 1024, progressBar1); //复制文件
            Thread.Sleep(0); //避免假死
            thdCopyFile.Abort();  //关闭线程
        }

        private void button1_Click(object sender, EventArgs e)//“源文件”按钮
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)  //打开文件对话框
            {
                textBox1.Text = openFileDialog1.FileName;  //获取源文件的路径
            }
        }

        private void button2_Click(object sender, EventArgs e)//“目的文件”按钮
        {
            if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
            {
                textBox2.Text = folderBrowserDialog1.SelectedPath;//获取目的文件的路径              
            }
        }

        private void botton3_Click(object sender, EventArgs e)//“复制”按钮
        {
            if (textBox1.Text.Trim() == string.Empty)
            {
                MessageBox.Show("OriginalFile cannot be empty!");
                return;
            }
            else
            {
                str = textBox1.Text;//记录源文件的路径
                str = str.Substring(str.LastIndexOf('\\') + 1, str.Length - str.LastIndexOf('\\') - 1); //获取源文件的名称
            }

            if (textBox2.Text.Trim() == string.Empty)
            {
                MessageBox.Show("The Copyfile path cannot be empty!");
                return;
            }
            else
            {
                thdCopyFile = new Thread(new ThreadStart(SetCopyFile));
                thdCopyFile.Start();
            }
        }

        private void textBox1_MouseHover(object sender, EventArgs e)//源文件文本框事件
        {
            ToolTip tooltip = new ToolTip();
            if (textBox1.Text.Trim() != string.Empty)
            {
                tooltip.Show(textBox1.Text, textBox1);
            }
            else
            {
                tooltip.Hide(textBox1);
            }
        }

        private void textBox2_MouseHover(object sender, EventArgs e)//目的文件文本框事件
        {
            ToolTip tooltip = new ToolTip();
            if (textBox2.Text.Trim() != string.Empty)
            {
                tooltip.Show(textBox2.Text, textBox2);
            }
            else
            {
                tooltip.Hide(textBox2);
            }
        }
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#:复制文件显示进度条 的相关文章

  • Windows 8中有没有特殊的API来挂载ISO文件?

    您可能知道 Windows 资源管理器允许将 ISO 文件装载到虚拟驱动器 有没有任何API可以用来做到这一点 本机函数调用AttachVirtualDisk https msdn microsoft com en us library w
  • 在 C# 中转换 VbScript 函数(Right、Len、IsNumeric、CInt)

    同样 我在 VbScript 中得到了以下代码 您能建议一下 C 中的等效代码吗 Function GetNavID Title getNavID UCase Left Title InStr Title 1 End Function 我已
  • C# 锁(mylocker) 不起作用

    我有很多 Web 服务调用 异步 在回调中 我会将结果绘制到 Excel 中 我想同步绘图方法 所以我使用以下内容 但是 从我在 Visual Studio 中追踪到 每次 lock locker 都会成功 并且有许多线程运行clearco
  • 了解 VerQueryValue

    在 MSDN 上 我注意到 VerQueryValue 函数的以下内容 lplp缓冲区 输出 低电压空洞当此方法返回时 包含指向 pBlock 指向的缓冲区中所请求版本信息的指针的地址 当关联的 pBlock 内存被释放时 lplpBuff
  • 在单个 C# 泛型方法中返回可为 null 和 null?

    C 泛型方法是否可以返回对象类型或 Nullable 类型 例如 如果我有一个安全的索引访问器List我想返回一个值 稍后我可以使用以下任一方法检查该值 null or HasValue 目前我有以下两种方法 static T SafeGe
  • C 语言中的套接字如何工作?

    我对 C 中的套接字编程有点困惑 You create a socket bind it to an interface and an IP address and get it to listen I found a couple of
  • 使用 strcpy 从整数生成指针,无需进行强制转换

    我不明白我做错了什么 我正在学习 C 很抱歉 如果这显然是错误的 但我正在尝试使用uthash http uthash sourceforge net 制作股票及其价格的哈希图 但是当我将股票添加到哈希映射时 我收到上述错误 我所做的就是从
  • 使用 C# 和反射打印完整的对象图

    我有一个复杂的对象 class A int Field1 int field2 property ClassB ClassB property classC classC etc etc 我想使用反射打印完整的对象图 有什么好的代码吗 一种
  • .NET:EventHandler 竞争条件修复如何工作?

    以下模式用于在引发事件时避免竞争条件 以防另一个线程取消订阅 MyEvent 使其为空 class MyClass public event EventHandler MyEvent public void F EventHandler h
  • 如何有效地左填充字节数组

    假设我有一个数组 LogoDataBy byte 0x00000008 0x00000000 0x41 0x00000001 0x42 0x00000002 0x43 0x00000003 0x44 0x00000004 0x31 0x00
  • 起订量工作单元

    我是单元测试的新手 我想为我的搜索功能创建一个测试 我的服务层看起来像 public class EmployeeService BaseService IEmployeeService public EmployeeService IUn
  • 用于轻松动态反射的 C# 库

    是否有任何库 例如开源项目等 可以更轻松地使用复杂的反射 例如动态创建对象或类 检查实例等 Thanks 有一个LinFu http www codeproject com KB cs LinFuPart1 aspx可用的库除了反射之外还可
  • MouseDoubleClick 事件不会冒泡

    我的场景经过简化 我有一个包含员工行的 ListView 在每个员工行中 都有 增加 和 减少 按钮来调整他的工资 假设在我的程序中 双击 员工 行意味着 解雇此人 The problem是当我快速单击 增加 时 这会触发 ListView
  • 关于 FirstOrDefault 或 SingleOrDefault

    FirstOrDefault 或 SingleOrDefault 将返回什么类型的数据 假设我的查询返回 3 条记录 例如 empid ename salary 1 joy 1500 2 rob 4500 3 jen 6500 所以如果我们
  • C++中的虚方法表存放在哪里?

    我想知道类对象 不是实例 而是类 如何存储在内存中 class A public int a virtual void f virtual A class B public A public int b void f final overr
  • C# 的 user32 和内核方法列表 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有一个很好的清单来说明我们可以从中进口什么user32 dll and kernel dll并在 C 中使用 我是 Windows A
  • cmake 包括其他目录中的 h 文件

    我在 cmake 项目下进行测试时遇到问题 我的项目是这样安排的 TerrainMap PointAccumulator heightQuadGrid Test 在 TerrainMap 目录中 CMakeLists txt 文件简单地概述
  • 随机排列

    我无法找到一种随机洗牌元素的好方法std vector经过一些操作后 恢复原来的顺序 我知道这应该是一个相当简单的算法 但我想我太累了 由于我被迫使用自定义随机数生成器类 我想我不能使用std random shuffle 无论如何这没有帮
  • 当一种语言是另一种语言的平行超集时,这意味着什么?

    我正在阅读关于实时并发 C 的期刊文章 http link springer com article 10 1007 2FBF00365999 并且它在摘要中提到 因此你们中的任何人都可以通过该链接查看上下文 Concurrent C 是
  • 如何将 IDispatch* 放入托管代码中

    我一直在考虑尝试使用 C 编写一个实现 OPOS 服务对象的 COM 对象 我已经使用自动化和 MFC 在 C 中完成了它 这并不太困难 所以我坚持尝试将其转换为一种方法 我将排除界面中的其他方法 因为它们很简单 或者我希望如此 id 6

随机推荐

  • 网卡中断优化

    1 中断的配置 root zxinos etc init d irq balancer status Checking for service irqbalance running etc init d irq balancer 是linu
  • 浅谈sleep、wait、yield、join区别

    sleep sleep 方法是属于 Thread 类中的 sleep 过程中线程不会释放锁 只会阻塞线程 让出cpu给其他线程 但是他的监控状态依然保持着 当指定的时间到了又会自动恢复运行状态 可中断 sleep 给其他线程运行机会时不考虑
  • 小甲鱼学python学习笔记

    一 序章 1 python缩进问题 if a 0 else while a 0 2 字符串拼接与控制台输入输出 input 可从控制台读入数据 括号内地字符串为输入时的提示 输入结果可通过变量保存 print 控制台输出 s input p
  • Linux 常用指令大全

    我是目录 1 指令格式 2 Windows 和 Linux 通用内容 3 路径的命令 1 cd 切换到某个目录 相对路径 绝对路径 2 pwd 显示当前路径 3 ls 列出目录下的所有子目录与文件 或 文件的信息 4 目录 文件的指令 1
  • 技术干货:解密最受欢迎的开源 Serverless 框架弹性技术实现

    Knative 是一款基于 Kubernetes 的开源 Serverless 应用编排框架 其目标是制定云原生 跨平台的 Serverless 应用编排标准 Knative 主要功能包括基于请求的自动弹性 缩容到 0 多版本管理 基于流量
  • 前端面试实习生(基础题)

    前言 经过一年的学习 我对vue框架有了清楚的认识 我就想着去找实习工作 这些天我投了100多份简历 接到了两个线上笔试 第一个面试题使用vue完成一个网页的模块 有要有分页与传输数据 这不重要 很容易写出来了 关键是第二个线上笔试题 很基
  • [iOS]深入浅出 iOS 之多线程 NSThread

    线程专题 http www cocoachina com bbs read php tid 43852 OS 支持多个层次的多线程 编程 层次越高的抽象程度越高 使用起来也越方便 也是苹果最推荐使用的方法 下面简要说明这三种不同范式 Thr
  • Netjs框架基础

    一 框架介绍 Nestjs 是以用于构建高可用可伸缩的后端应用框架 并且全面支持 Typescript 在背后 Nestjs 使用了强大的 http 框架 默认是 express 并且可以配置选择其他的 Http 服务框架 二 Contro
  • simswap安装过程中遇到的一些问题

    simswap与deepfacelab很像 但是simswap的泛用性远强于deepfacelab 个人认为simswap名气不如deepfacelab的原因有以下几点 1 缺乏发行版 2 缺乏文档 3 最终训练效果不一定好 本文旨在记录一
  • 它们把色情版 “微信” 的底裤都给挖出来了,网友: 草率了。。。

    作者 暗影安全实验室 来源 anquanke com post id 219729 背景 近日 恒安嘉新暗影安全实验室平台监测到一款名为 乐宝 的仿冒应用 安全研究人员第一时间对该应用进行了研究分析 发现该应用表面上是一款与微信具有相似页面
  • wireshark 导出指定tcp流的数据包

    数据包回放时 如果我们只想将pcap包中的部分数据进行回放 怎么办呢 首先使用wireshark打开文件 在过滤器中进行过滤 比如我只想要tcp stream eq 0的数据 可以如下操作 过滤好数据 然后依次操作 文件 gt 导出特定分组
  • 离散余弦变换

    离散余弦变换 DCT for Discrete Cosine Transform 是与傅里叶变换相关的一种变换 它类似于离散傅里叶变换 DFT for Discrete Fourier Transform 但是只使用实数 离散余弦变换相当于
  • 三、PCL点云处理滤波器----(1)直通滤波器

    一 为什么要进行滤波 在获取点云数据时 由于设备精度 操作者经验 环境因素等带来的影响 以及电磁波衍射特性 被测物体表面性质变化和数据拼接配准操作过程的影响 点云数据中将不可避免地出现一些噪声点 实际应用中除了这些测量随机误差产生的噪声点之
  • ImportError: No module named cv2的完美解决方法!!!(不能太赞)

    此刻是2018年1月21日晚10点13分 我怀着激动的心情 从Ubuntu系统上登上我的CSDN博客然后发来贺电 祝贺我自己解决了ImportError No module named cv2的问题 这仿佛是从另一个世界 Ubuntu世界
  • L1-043 阅览室(java)

    1 题目描述 天梯图书阅览室请你编写一个简单的图书借阅统计程序 当读者借书时 管理员输入书号并按下S键 程序开始计时 当读者还书时 管理员输入书号并按下E键 程序结束计时 书号为不超过1000的正整数 当管理员将0作为书号输入时 表示一天工
  • 【系统函数】2. 系统的因果性、稳定性

    1 系统的因果性 系统的因果性 非因果性 连续因果系统的充要条件 离散因果系统的充要条件 2 系统的稳定性 系统稳定的必要性 稳定系统 连续系统 是 稳定系统 的充要条件 离散系统 是 稳定系统 的充要条件 因果系统 是 稳定系统 的充要条
  • 2012,改变AGI命运的180天

    2012年12月初的一天 一场秘密竞拍正在美国滑雪胜地太浩湖 Lake Tahoe 的一家赌场酒店里进行 太浩湖位于加州和内华达州交界处 是北美最大的高山湖泊 拥有蓝宝石般的湖面和顶级雪道 教父2 曾在这里取景 马克吐温曾在此地流连忘返 而
  • 关于ESD静电测试以及实际案例的修改(怎么让你的PCB更加好过ESD)

    背景 最近楼主的两个项目客户要求要过ESD测试 分别是4KV和8KV的空气放电和4KV的接触放电 其中一个MCU的ESD保护做得比较好 还有就是产品设计比较简单 没有USB 蓝牙这些 所以ESD过也是稳稳的 不加TVS管也是过了 另外一个就
  • Python使用tkinter开发一个简单的参数计算软件模板,可用于设计估算,制造业算料,各种包含参数变量的简单计算

    一 开发前因 最近在制造业转了一圈 发现很多传统制造业在设计或者加工下料过程中 需要根据一些固定参数和现场实际的变量 去估算出设计的范围值或者所需要的材料用量 这种计算当然都会有固定的参数和变量组成的公式 但是现场的计算方式感人 要么用计算
  • C#:复制文件显示进度条

    1 窗口界面 主要是文本框textBox 按钮button 进度条prograssBar三大组件所组成的 2 完整代码 using System using System IO using System Windows Forms usin