Показывать диалог/форму Копировать файлы при копировании файлов вручную на С#?
Я вручную копирую некоторые папки и файлы через С#, и я хочу показать пользователю, что что-то действительно происходит. В настоящее время программа выглядит как замороженная, но на самом деле она копирует файлы.
Я бы подумал, что есть уже встроенный диалог или форма, которая показывает процесс, похожий на копирование/перемещение файлов в проводнике 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();
Это позволяет использовать существующую логику копирования файлов и по-прежнему обеспечивать приятный пользовательский интерфейс.