如何在 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
我有一个以 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