Показывать диалог/форму Копировать файлы при копировании файлов вручную на С#?

Я вручную копирую некоторые папки и файлы через С#, и я хочу показать пользователю, что что-то действительно происходит. В настоящее время программа выглядит как замороженная, но на самом деле она копирует файлы.

Я бы подумал, что есть уже встроенный диалог или форма, которая показывает процесс, похожий на копирование/перемещение файлов в проводнике Windows. Есть ли что-нибудь подобное, или мне нужно создать все с нуля?

Кроме того, будет ли это лучшим способом показать пользователю, что что-то активно происходит?

Спасибо за помощь!

Ответ 1

Один из них встроен в пространство имен Microsoft.VisualBasic.FileIO. Не позволяйте имени пугать вас, это очень недооцененное пространство имен для С#. Статический класс FileSystem имеет метод CopyFile и CopyDirectory, который имеет такую возможность.

Члены файловой системы

Обратите особое внимание на UIOption в методах CopyFile и CopyDirectory. Это эмулирует отображение окна копирования Проводника Windows.

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

Ответ 2

Если вы используете поток BackgroundWorker, вы можете отобразить диалог прогресса. Вам нужно будет использовать поток, если вы не хотите блокировать пользовательский интерфейс.

Пример на этой странице MSDN показывает, как обновить индикатор прогресса. В этом случае это в основной форме приложения, но вы можете создать свой собственный диалог для этого.

Ответ 3

Это зависит от пользовательского опыта, который вы хотели бы предоставить. Вы можете использовать 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();

Это позволяет использовать существующую логику копирования файлов и по-прежнему обеспечивать приятный пользовательский интерфейс.