带进度条的文件复制

2023-11-27

我使用了这段代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
using System.IO;

namespace WindowsApplication1 {
  public partial class Form1 : Form {
    // Class to report progress
    private class UIProgress {
      public UIProgress(string name_, long bytes_, long maxbytes_) {
        name = name_; bytes = bytes_; maxbytes = maxbytes_;
      }
      public string name;
      public long bytes;
      public long maxbytes;
    }
    // Class to report exception {
    private class UIError {
      public UIError(Exception ex, string path_) {
        msg = ex.Message; path = path_; result = DialogResult.Cancel;
      }
      public string msg;
      public string path;
      public DialogResult result;
    }
    private BackgroundWorker mCopier;
    private delegate void ProgressChanged(UIProgress info);
    private delegate void CopyError(UIError err);
    private ProgressChanged OnChange;
    private CopyError OnError;

    public Form1() {
      InitializeComponent();
      mCopier = new BackgroundWorker();
      mCopier.DoWork += Copier_DoWork;
      mCopier.RunWorkerCompleted += Copier_RunWorkerCompleted;
      mCopier.WorkerSupportsCancellation = true;
      OnChange += Copier_ProgressChanged;
      OnError += Copier_Error;
      button1.Click += button1_Click;
      ChangeUI(false);
    }

    private void Copier_DoWork(object sender, DoWorkEventArgs e) {
      // Create list of files to copy
      string[] theExtensions = { "*.jpg", "*.jpeg", "*.bmp", "*.png", "*.gif" };
      List<FileInfo> files = new List<FileInfo>();
      string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
      DirectoryInfo dir = new DirectoryInfo(path);
      long maxbytes = 0;
      foreach (string ext in theExtensions) {
        FileInfo[] folder = dir.GetFiles(ext, SearchOption.AllDirectories);
        foreach (FileInfo file in folder) {
          if ((file.Attributes & FileAttributes.Directory) != 0) continue;
          files.Add(file);
          maxbytes += file.Length;
        }
      }
      // Copy files
      long bytes = 0;
      foreach (FileInfo file in files) {
        try {
          this.BeginInvoke(OnChange, new object[] { new UIProgress(file.Name, bytes, maxbytes) });
          File.Copy(file.FullName, @"c:\temp\" + file.Name, true);
        }
        catch (Exception ex) {
          UIError err = new UIError(ex, file.FullName); 
          this.Invoke(OnError, new object[] { err });
          if (err.result == DialogResult.Cancel) break;
        }
        bytes += file.Length;
      }
    }
    private void Copier_ProgressChanged(UIProgress info) {
      // Update progress
      progressBar1.Value = (int)(100.0 * info.bytes / info.maxbytes);
      label1.Text = "Copying " + info.name;
    }
    private void Copier_Error(UIError err) {
      // Error handler
      string msg = string.Format("Error copying file {0}\n{1}\nClick OK to continue copying files", err.path, err.msg);
      err.result = MessageBox.Show(msg, "Copy error", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation);
    }
    private void Copier_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
      // Operation completed, update UI
      ChangeUI(false);
    }
    private void ChangeUI(bool docopy) {
      label1.Visible = docopy;
      progressBar1.Visible = docopy;
      button1.Text = docopy ? "Cancel" : "Copy";
      label1.Text = "Starting copy...";
      progressBar1.Value = 0;
    }
    private void button1_Click(object sender, EventArgs e) {
      bool docopy = button1.Text == "Copy";
      ChangeUI(docopy);
      if (docopy) mCopier.RunWorkerAsync();
      else mCopier.CancelAsync();
    }
  }
}

posted here(那个nobugz已发布)在复制文件并在进度栏中显示状态。

我想在复制时不断增加进度条的值,尤其是大文件。此示例代码中发生的情况是,进度条中的值在复制每个文件时停止,复制一个文件后,它将增加到要复制的下一个文件的大小。我希望它像CopyFileEx在 Windows 中,复制时进度条不断增加(我无法使用CopyFileEx因为我想有自己的实现)。


你需要这样的东西:

public delegate void ProgressChangeDelegate(double Percentage, ref bool Cancel);
public delegate void Completedelegate();

class CustomFileCopier
{
    public CustomFileCopier(string Source, string Dest)
    {
        this.SourceFilePath = Source;
        this.DestFilePath = Dest;

        OnProgressChanged += delegate { };
        OnComplete += delegate { };
    }

    public void Copy()
    {
        byte[] buffer = new byte[1024 * 1024]; // 1MB buffer
        bool cancelFlag = false;

        using (FileStream source = new FileStream(SourceFilePath, FileMode.Open, FileAccess.Read))
        {
            long fileLength = source.Length;
            using (FileStream dest = new FileStream(DestFilePath, FileMode.CreateNew, FileAccess.Write))
            {
                long totalBytes = 0;
                int currentBlockSize = 0;

                while ((currentBlockSize = source.Read(buffer, 0, buffer.Length)) > 0)
                {
                    totalBytes += currentBlockSize;
                    double percentage = (double)totalBytes * 100.0 / fileLength;

                    dest.Write(buffer, 0, currentBlockSize);

                    cancelFlag = false;
                    OnProgressChanged(percentage, ref cancelFlag);

                    if (cancelFlag == true)
                    {
                        // Delete dest file here
                        break;
                    }
                }
            }
        }

        OnComplete();
    }

    public string SourceFilePath { get; set; }
    public string DestFilePath { get; set; }

    public event ProgressChangeDelegate OnProgressChanged;
    public event Completedelegate OnComplete;
}

只需在单独的线程中运行它并订阅OnProgressChanged event.

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

带进度条的文件复制 的相关文章

  • 如何将 protobuf-net 与不可变值类型一起使用?

    假设我有一个像这样的不可变值类型 Serializable DataContract public struct MyValueType ISerializable private readonly int x private readon
  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • 使用 %d 打印 unsigned long long

    为什么我打印以下内容时得到 1 unsigned long long int largestIntegerInC 18446744073709551615LL printf largestIntegerInC d n largestInte
  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 使用 .NET Process.Start 运行时挂起进程 - 出了什么问题?

    我在 svn exe 周围编写了一个快速而肮脏的包装器来检索一些内容并对其执行某些操作 但对于某些输入 它偶尔会重复挂起并且无法完成 例如 一个调用是 svn list svn list http myserver 84 svn Docum
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List
  • 当我使用 OpenSSL1.1.0g 根据固定的 p 和 g 值创建 Diffie Hellman 密钥协议密钥时,应该执行哪些检查?

    您好 我尝试通过这段代码使用修复 p 和 g 参数来制作 Diffie Hellman Keysanswer https stackoverflow com a 54538811 4706711 include

随机推荐

  • 使用 CAShapeLayer 和 UIBezierPath 剪辑遮罩 uiview

    我在使用 CAShapeLayer UIBezierPath 剪切视图时遇到问题 我想剪切内容 但最终得到了 UIBezierPath 的笔画 框架 这是我的代码 UIBezierPath path2Path UIBezierPath be
  • 将字符串解析为日期时间,同时考虑 pandas 中的 AM/PM

    我正在尝试解析这种格式的字符串 2018 07 07 04 AM 使用 strftime 格式转换为 pandas 日期时间 但是 在我看来 该格式无法识别之间的区别AM and PM 这是我尝试过的 pd to datetime 2018
  • 如何检查某个目录是否位于 Bash 的路径上? [复制]

    这个问题在这里已经有答案了 可能的重复 Bash 检测用户的路径中是否有特定目录 给定一个目录 如何确定它是否在 unix PATH 上 正在寻找 shell 脚本 谢谢 凯文 你可以写 if PATH directory you want
  • 如何更改 ggplot 中的标签(图例)?

    我的代码如下 我想更改ggplot的标签 但R总是提醒我 Error in unit tic pos c mm x and units must have length gt 0 我应该怎么办 ggplot mat aes x sales
  • 如何唤醒休眠的 pthread?

    我正在用 C 编写一个程序 我注意到它获得了许多线程 其目的是每隔一段时间做一些事情 其中 有 3 或 4 个 我决定通过编写一个调度程序服务来重构 使用这些线程的其他地方可以订阅该服务 这应该将我随时运行的额外事件线程的数量减少到一个 我
  • 将 TOP 与 GROUP BY 一起使用

    带桌子table1像下面这样 flight orig dest passenger bags 1111 sfo chi david 3 1112 sfo dal david 7 1112 sfo dal kim 10 1113 lax sa
  • std::throw_with_nested 需要 C++11 中的多态类型吗?

    为什么不能编译 尝试使用 Clang 3 4 2 和 GCC 版本 4 7 4 4 8 3 和 4 9 1 include
  • 从外部 div 滚动 div

    查看下面的小型 html 结构示例以了解上下文 看看这个fiddle问题的示例 对小提琴用户的简短说明 向左滚动 垂直滚动条不可见 向右滚动 垂直可见 我希望垂直滚动条始终可见 要求 标题必须保持固定 滚动时可见 长解释 我有一个带有固定标
  • C++:模板和单例模式

    碰巧我需要臭名昭著的单例模式 更好的是 它发生了 所以我需要臭名昭著的 C 模板与该模式的结合 那么 让我烦恼的是 template
  • 事件调度程序应每月执行一次

    我的机器上安装了 Win XP 操作系统和 XAMPP 我需要在每月第一天的凌晨 12 00 00 执行我的事件 调度程序 意思是每个月的1号 例如 1 月 1 日 2 月 1 日 3 月 1 日 和 我还需要在同一事件中调用存储过程 我想
  • 如何在生产中管理 ASP.NET SQL 成员角色/用户?

    如何在生产计算机上设置 asp net sql 成员资格角色 成员资格提供程序 我正在尝试设置 BlogEngine NET 所有文档都说要使用 Visual Studio 中的 ASP NET 网站管理工具 但这在生产计算机上不可用 我是
  • ExtJS按钮样式工具栏[重复]

    这个问题在这里已经有答案了 我想知道是否可以将按钮放入面板的工具栏中 但让它保留按钮的外观 就好像它只是在普通面板中一样 例如 我希望按钮看起来像这样 然而 它看起来像这样 非常感谢 EDIT 创建工具栏的代码 xtype toolbar
  • 稳健的多边形法线计算

    是否有一个好的鲁棒算法来计算凸多边形的法向量 当然是3D 对于三角形 这很容易 取三角形的两条边并计算叉积 vec3 u point 0 point 1 v point 0 point 2 vec3 n normalize cross u
  • 如何将时间戳列映射到JPA类型?

    我正在使用 玩 1 2 4 和 PostgreSQL 9 1 我创建了一个表created at列 类型 timestamp without time zone 它的默认值为now 当我使用该表的实体类获取数据时 问题就出现了 这creat
  • Magento:缩小 HTML 输出?

    magento中是否有任何文件可以输出所有html 我想缩小所有 html 输出 Magento 使用响应对象发送所有输出 所有的输出都会添加到这个对象中 然后它的sendResponse方法被调用 如果你想改变输出 设置一个监听器http
  • UTF-8百分比编码和python

    我试图让 python 给我百分比编码的字符串 我正在与之交互的 API 我认为它使用的是百分比编码的 UTF 8 为 提供 c3 ae 然而 python 的 urllib quote 给出 3F import urllib mystri
  • Java 相当于 Kotlin 中的 arrayof()/ listof()/ setof()/ mapof()

    我只是想知道java是否有像kotlin中那样的arrayof listof setof mapof 等价物 如果没有 有什么方法可以类似地工作吗 我发现它们与java非常不同 顺便说一句 intArrayOf arraylistof ha
  • 如何在 R 中比较两个数据框/表并提取数据?

    在尝试提取下面两个数据帧之间的不匹配项时 我已经成功创建了一个新的数据帧 其中不匹配项被替换 我现在需要的是不匹配的列表 dfA lt structure list animal1 c AA TT AG CA animal2 c AA TB
  • 操作栏显示在其选项卡下方

    当我设置这些属性时 actionBar getSupportActionBar actionBar setDisplayHomeAsUpEnabled true actionBar setDisplayShowHomeEnabled fal
  • 带进度条的文件复制

    我使用了这段代码 using System using System Collections Generic using System ComponentModel using System Windows Forms using Syst