Прогрессбар во время копирования папки - PullRequest
0 голосов
/ 22 января 2019

Мне нужно отображать прогресс во время копирования папок (асинхронно).
Я могу сделать это с одной копией файла, но не с папкой ... Я просто хочу показать ход всей копии, как в Windows.

Вот мой код для копирования папки:

private void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs, CancellationToken cancellationToken)
{
    cancellationToken.ThrowIfCancellationRequested();
    DirectoryInfo dir = new DirectoryInfo(sourceDirName);

    DirectoryInfo[] dirs = dir.GetDirectories();
    // If the destination directory doesn't exist, create it.
    if (!Directory.Exists(destDirName))
    {
        Directory.CreateDirectory(destDirName);
    }

    if (!Directory.Exists(destDirName))
    {
        throw new DirectoryNotFoundException(
            "Source directory does not exist or could not be found: "
            + sourceDirName);
    }

    // Get the files in the directory and copy them to the new location.
    FileInfo[] files = dir.GetFiles();
    foreach (FileInfo file in files)
    {
        string temppath = Path.Combine(destDirName, file.Name);
        file.CopyTo(temppath, false);
    }

    // If copying subdirectories, copy them and their contents to new location.
    if (copySubDirs)
    {
        foreach (DirectoryInfo subdir in dirs)
        {
            string temppath = Path.Combine(destDirName, subdir.Name);
            DirectoryCopy(subdir.FullName, temppath, copySubDirs, cts.Token);
        }
    }
}

Тогда это вызывается кнопкой:

await Task.Run(() => DirectoryCopy(
    srcFolder, 
    @"\\" + hostname + @"\C$\" + destFolder + @"\", 
    true, 
    cts.Token
));

Как мне этого добиться?

Скажите, если информации о моей проблеме недостаточно, я обновлю свой пост.

1 Ответ

0 голосов
/ 22 января 2019

Вы можете использовать интерфейс IProgress.

Например,

private async Task DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs, CancellationToken cancellationToken,IProgress<int> progress)
{
    // Do work
    var percentageProgress = 0;
    // percentageProgress = Calculate percentage
    progress.Report(percentageProgress);
}

А у клиента (поверьте вашему событию нажатия кнопки)

var progressIndicator = new Progress<int>(ShowProgress);
await UploadPicturesAsync(sourceDirName,destDirName,copySubDirs,token,progressIndicator);

Где ShowProgress определяется как

void ShowProgress(int value)
{
// Update UI
}

Вы можете узнать больше об IProgress здесь и здесь тоже

...