Копирование файлов + индикатор выполнения с использованием байтов - PullRequest
3 голосов
/ 12 декабря 2011

Я пытаюсь добавить прогресс в форму для копирования файлов, чтобы она работала, но индикатор выполнения обновляется в зависимости от количества файлов. Проблема в том, что есть много маленьких файлов, и некоторые действительно большие, которые нужно скопировать.

Так что я хотел бы знать, если вместо того, чтобы использовать номер файла, есть ли способ проверить количество записываемых байтов. Любые предложения очень ценятся. Вот код, который я сейчас имею:

    private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        string SourcePath = RegistryRead.ReadOriginalPath();
        string DestinationPath = RegistryRead.ReadNewPath();

        if (Directory.Exists(SourcePath))
        {
            //Now Create all of the directories 
            string[] allDirectories = Directory.GetDirectories(SourcePath, "*", SearchOption.AllDirectories);
            string[] allFiles = Directory.GetFiles(SourcePath, "*.*", SearchOption.AllDirectories);
            int numberOfItems = allDirectories.Length + allFiles.Length;
            int progress = 0;

            foreach (string dirPath in allDirectories)
            {
                Directory.CreateDirectory(dirPath.Replace(SourcePath, DestinationPath));
                progress++;
                BackgroundWorker.ReportProgress(100 * progress / numberOfItems);
            }

            //Copy all the files 
            foreach (string newPath in allFiles)
            {
                File.Copy(newPath, newPath.Replace(SourcePath, DestinationPath));
                progress++;
                BackgroundWorker.ReportProgress(100 * progress / numberOfItems);
            }
        }

    }

    private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        // Change the value of the ProgressBar to the BackgroundWorker progress.
        progressBar1.Value = e.ProgressPercentage;
    }

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 12 декабря 2011

Если вы хотите сделать это самостоятельно, вы можете

  1. Итерировать по всем файлам, считая общий размер для копирования.
  2. Вызовите CopyFileEx, чтобы выполнить копирование.При этом используется механизм обратного вызова для сообщения о ходе выполнения, и этот обратный вызов включает в себя количество байтов, скопированных для текущего файла.
  3. Отслеживайте общее количество скопированных байт и используйте его для сообщения об общем ходе.

Возможно, существует .net управляемый эквивалент CopyFileEx.

Однако я бы порекомендовал вызвать SHFileOperation и позволить системе выполнить за вас тяжелую работу.Поскольку вы обнаруживаете, что это задание чрезвычайно трудно выполнить хорошо.В качестве дополнительного преимущества использования оболочки для выполнения работы вы получите стандартный системный диалог.

0 голосов
/ 12 декабря 2011

Вам нужно будет внедрить свой собственный код для копирования файлов и сообщить о прогрессе оттуда.

РЕДАКТИРОВАТЬ: Если вы не хотите копировать файлы самостоятельно, вы можете запустить другой фоновый работник, который будет проверять ход копирования файла (получить свойства текущего скопированного файла и проверить его длину).Если вы не столкнетесь с проблемами совместного использования, он предоставит вам информацию, необходимую для обновления индикатора выполнения.

...