【问题标题】:Show a Copying-files dialog/form while manually copying files in C#?在 C# 中手动复制文件时显示复制文件对话框/表单?
【发布时间】:2011-03-03 17:49:44
【问题描述】:

我正在通过 C# 手动复制一些文件夹和文件,并且我想向用户展示实际正在发生的事情。目前,该程序看起来好像它被冻结了,但它实际上是在复制文件。

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

另外,这是否是向用户显示某事正在积极进行的最佳方法?

感谢您的帮助!

【问题讨论】:

    标签: c# file user-interface dialog


    【解决方案1】:

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

    FileSystem Members

    密切注意CopyFileCopyDirectory 方法中的UIOption。此模拟显示 Windows 资源管理器复制窗口。

    FileSystem.CopyFile(sourceFile, destinationFile, UIOption.AllDialogs);
    FileSystem.CopyDirectory(sourceDirectory, destinationDirectory, UIOption.AllDialogs);
    

    【讨论】:

    • 哇,真的被低估了。我从来没有听说过那个命名空间。我必须创建一个递归方法才能使用“文件”命名空间复制目录及其子目录。这要简单得多!我没有为 Visual Studio 安装 VB 包。我假设我必须安装它才能访问命名空间,是吗?
    • 它是 .net 框架的一部分。只需将 Microsoft.VisualBasic 引用添加到您的项目中,您就可以开始了。
    • 我做到了,但是从那个命名空间我只能看到它的“VBCodeProvider”类。用 VB 更新 VS 看看能不能得到更多的东西。
    • 啊,参考!我只在顶部添加了一个“使用”。现在可以正常工作了,谢谢!
    • 非常好的方法!但是如何为多个复制/移动操作显示一个相同的对话框?如果我为每个单独的操作调用 CopyFile/MoveFile,则会打开几个对话框,每个对话框都显示“正在复制/移动 1 个元素”——这对我来说并不友好。还有其他想法吗? :)
    【解决方案2】:

    这取决于您希望提供的用户体验。您可以使用 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();
    

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

    【讨论】:

      【解决方案3】:

      如果您使用BackgroundWorker 线程,您可以显示一个进度对话框。如果您不想锁定 UI,则需要使用线程。

      MSDN page 上的示例显示了如何更新进度指示器。在这种情况下,它位于主申请表上,但您可以为此创建自己的对话框。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-26
        • 1970-01-01
        • 2011-02-03
        • 1970-01-01
        • 1970-01-01
        • 2021-08-20
        相关资源
        最近更新 更多