我通过C#手动复制一些文件夹和文件,我想向用户显示某些内容正在进行中。目前,程序看起来像一样冻结,但它实际上是在复制文件。
我认为已经有一个显示该过程的内置对话框或表单,类似于在Windows资源管理器中复制/移动文件。有没有可用的东西,或者我是否必须从零开始创建所有内容?
此外,这是向用户显示某些内容正在积极进行的最佳方法吗?
感谢您的帮助!
答案 0 :(得分:22)
Microsoft.VisualBasic.FileIO 命名空间内置了一个。不要让这个名字欺骗你,它是一个非常被低估的C#命名空间。静态类FileSystem
具有CopyFile
和CopyDirectory
方法,具有该功能。
密切关注UIOption
和CopyFile
方法中的CopyDirectory
。此模拟显示Windows资源管理器复制窗口。
FileSystem.CopyFile(sourceFile, destinationFile, UIOption.AllDialogs);
FileSystem.CopyDirectory(sourceDirectory, destinationDirectory, UIOption.AllDialogs);
答案 1 :(得分:0)
如果您使用BackgroundWorker
主题,则可以显示进度对话框。如果您不想锁定UI,则需要使用线程。
此MSDN page上的示例显示了如何更新进度指示器。在这种情况下,它位于主申请表上,但您可以为此创建自己的对话框。
答案 2 :(得分:0)
这取决于您想要提供的用户体验。您可以使用Windows API显示标准副本对话框;但是,我相信你的申请仍然没有反应。
我建议这样的事情:
// WPF
System.Threading.Thread t = new System.Threading.Thread(() =>
{
foreach(String file in filesToCopy)
{
// copy file here
// WPF UI Update
Dispatcher.BeginInvoke(() =>
{
// progressBar Update
});
}
});
// WinForms
System.Threading.Thread t = new System.Threading.Thread(() =>
{
foreach(String file in filesToCopy)
{
// copy file here
// WinForms UI Update
Form1.BeginInvoke(() =>
{
// progressBar Update
});
}
});
// in either case call
t.Start();
这允许您使用现有的文件复制逻辑,并且仍然提供良好的响应式用户界面。