在C#中手动复制文件时显示复制文件对话框/表单?

时间:2010-06-14 21:51:55

标签: c# file user-interface dialog

我通过C#手动复制一些文件夹和文件,我想向用户显示某些内容正在进行中。目前,程序看起来像一样冻结,但它实际上是在复制文件。

我认为已经有一个显示该过程的内置对话框或表单,类似于在Windows资源管理器中复制/移动文件。有没有可用的东西,或者我是否必须从零开始创建所有内容?

此外,这是向用户显示某些内容正在积极进行的最佳方法吗?

感谢您的帮助!

3 个答案:

答案 0 :(得分:22)

Microsoft.VisualBasic.FileIO 命名空间内置了一个。不要让这个名字欺骗你,它是一个非常被低估的C#命名空间。静态类FileSystem具有CopyFileCopyDirectory方法,具有该功能。

FileSystem Members

密切关注UIOptionCopyFile方法中的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();

这允许您使用现有的文件复制逻辑,并且仍然提供良好的响应式用户界面。