如何在 C# 中跟踪 File.Copy()?

How to track the File.Copy() in C#?

我有一个以 GB 为单位的非常大的文件。我在 C# win Form(不是 WPF)中使用 File.Copy() 函数。

但是,如果正在复制文件,表单将作为进程挂起。我一直在寻找一种解决方案来帮助我跟踪 File.Copy() 的进度。但我不想用自定义的东西使进度复杂化。

请建议我能做什么。我是 Forms 和 C# 的新手。我希望我能得到解决方案。

您的表单挂起,因为 UI 内容(如更新表单内容、响应事件、移动 window 等)在主线程(所谓的 STA 线程)中执行。 为了在执行某些操作时不挂起 UI,您应该为您的 long-运行 操作创建另一个线程。有很多方法可以做到,但最简单的是使用 TPL 的 Task.Run:

void Click(object sender, EventArgs args) 
{
   Task.Run(CopyFile);
}

void CopyFile() 
{
   File.Copy(this.src, this.target);
   // note that since we're in different thread, we cannot interact with UI,
   // so you have to dispatch your operations to UI thread. That can be done just using 
   // Control's Invoke method
   this.Invoke(NotifySuccess);
}

至于显示进度,会稍微复杂一点。由于 File.Copy() 不支持进度报告,您必须使用 FileStreams。您可以在此处查看示例:

我有个好主意。为什么只能使用 windows 复制对话框? 只需添加一个参考:

Microsoft.VisualBasic

并使用代码:

try
  {
    FileSystem.CopyFile(source_path, destination_path, UIOption.AllDialogs);
  } 

catch (Exception ext)
   {
      MessageBox.Show(ext.Message);
   }

我想这会有所帮助。

您可以使用 BackgroundWorker 来完成此任务。

您也可以通过这种方式创建自己的表单并实时显示进度。

这样,您就不需要使用 windows 默认对话框。

使用这两个链接作为参考。此外,Google 上有很多 material 可用,因此应该没有任何问题。

https://www.youtube.com/watch?v=2qQgctSi4iY

Running a method in BackGroundWorker and Showing ProgressBar